我具有以下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;
}
我想做的是使用NSString并对其进行SHA1编码。该部分似乎在起作用,我认为我要解决的问题是如何将NSData对象转换回清晰的字符串。如果我使用UTF8编码,我将变成空白,如果我说ASCII,我将得到奇怪的字符。我真正想要的是十六进制字符串,但我不知道如何获取它。这是使用iPhone 3.0 SDK。
目前,我传入的任何String都返回NULL。
最佳答案
简短的答案:开启gcc警告(-Wall)。
长答案:
NSMutableData *dataToHash = [[NSMutableData alloc] init];
[dataToHash appendData:[str dataUsingEncoding:NSUTF8StringEncoding]];
已损坏:您尝试在需要NSData参数的地方使用C字符串。采用
NSMutableData *dataToHash = [str dataUsingEncoding:NSUTF8StringEncoding];
反而。
该方法的其余部分使用SHA1缓冲区,然后尝试将此数据解释为UTF-8 C字符串,这可能会崩溃或产生任何意外结果。首先,缓冲区不是UTF-8字符串。其次,它不是以null终止的。
您想要的是将SHA1转换为基数为64或类似的字符串。 Here's a nice post有关如何执行此操作。
关于objective-c - 尝试编写NSString sha1函数,但返回null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1353771/