我具有以下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/

10-13 07:52