rus*_*elf 5 iphone sha1 objective-c nsstring nsdata
我有以下Objective-C函数:
+(NSString *)stringToSha1:(NSString *)str{
NSMutableData *dataToHash = [[NSMutableData alloc] init];
[dataToHash appendData:[str dataUsingEncoding:NSUTF8StringEncoding]];
unsigned char hashBytes[CC_SHA1_DIGEST_LENGTH];
CC_SHA1([dataToHash bytes], [dataToHash length], hashBytes);
NSData *encodedData = [NSData dataWithBytes:hashBytes length:CC_SHA1_DIGEST_LENGTH];
[dataToHash release];
NSString *encodedStr = [NSString stringWithUTF8String:[encodedData bytes]];
//NSString *encodedStr = [[NSString alloc] initWithBytes:[encodedData bytes]
// length:[encodedData length] encoding: NSUTF8StringEncoding];
NSLog(@"String is %@", encodedStr);
return encodedStr;
}
Run Code Online (Sandbox Code Playgroud)
我要做的是采用NSString和SHA1编码.这部分似乎正在起作用,我认为我所处的位置是如何将NSData对象转换回清晰的字符串.如果我使用UTF8编码,我会变成空白,如果我说ASCII,我会得到奇怪的字符.我真正想要的是十六进制字符串,但我不知道如何获得它.这是使用iPhone 3.0 SDK.
目前,我传入的任何String都会返回NULL.
小智 27
我的SHA1函数版本(更简单):
- (NSString *)sha1:(NSString *)str {
const char *cStr = [str UTF8String];
unsigned char result[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(cStr, strlen(cStr), result);
NSString *s = [NSString stringWithFormat:
@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
result[0], result[1], result[2], result[3], result[4],
result[5], result[6], result[7],
result[8], result[9], result[10], result[11], result[12],
result[13], result[14], result[15],
result[16], result[17], result[18], result[19]
];
return s;
}
Run Code Online (Sandbox Code Playgroud)
和MD5:
- (NSString *)md5:(NSString *)str {
const char *cStr = [str UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(cStr, strlen(cStr), result);
NSString *s = [NSString stringWithFormat:
@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
result[0], result[1], result[2], result[3], result[4],
result[5], result[6], result[7],
result[8], result[9], result[10], result[11], result[12],
result[13], result[14], result[15]
];
return s;
}
Run Code Online (Sandbox Code Playgroud)
简短回答:打开 gcc 警告 (-Wall)。
长答案:
NSMutableData *dataToHash = [[NSMutableData alloc] init];
[dataToHash appendData:[str dataUsingEncoding:NSUTF8StringEncoding]];
Run Code Online (Sandbox Code Playgroud)
已损坏:您尝试在需要 NSData 参数的地方使用 C 字符串。使用
NSMutableData *dataToHash = [str dataUsingEncoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)
反而。
该方法的其余部分采用 SHA1 缓冲区并尝试将此数据解释为 UTF-8 C 字符串,这可能会崩溃或产生任何意外结果。首先,缓冲区不是 UTF-8 字符串。其次,它不是以 null 终止的。
您想要的是将 SHA1 转换为 Base 64 或类似的字符串。这是一篇关于如何做到这一点的好文章。
| 归档时间: |
|
| 查看次数: |
12277 次 |
| 最近记录: |