根据我的要求:
我知道如何将字符串转换为SHA1,但剩下的部分对我来说有点暗淡。 我已经完成了最后两个步骤。
unsigned char digest[CC_SHA1_DIGEST_LENGTH];
NSData *dataString = [yourString dataUsingEncoding: NSUTF8StringEncoding];
if (CC_SHA1([dataString bytes], [dataString length], digest)) {
//Sha1 is calculated & stored in digest.
}
任何帮助将不胜感激。
答案 0 :(得分:11)
我已经创建了这个功能,可以根据您的要求正常工作。你只需要输入一个字符串。
#import <CommonCrypto/CommonDigest.h>
- (NSString *)calculateSHA:(NSString *)yourString
{
const char *ptr = [yourString UTF8String];
int i =0;
int len = strlen(ptr);
Byte byteArray[len];
while (i!=len)
{
unsigned eachChar = *(ptr + i);
unsigned low8Bits = eachChar & 0xFF;
byteArray[i] = low8Bits;
i++;
}
unsigned char digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(byteArray, len, digest);
NSMutableString *hex = [NSMutableString string];
for (int i=0; i<20; i++)
[hex appendFormat:@"%02x", digest[i]];
NSString *immutableHex = [NSString stringWithString:hex];
return immutableHex;
}
然后你只需要调用上面的方法。
[self calculateSHA:yourString];
答案 1 :(得分:1)
NSData *dataString = [yourString dataUsingEncoding: NSUTF8StringEncoding];
将字符串转换为UTF-8字节,例如“é”= Unicode 00E9转换为两个字节C3 A9
,“€”= Unicode 20AC转换为三个字节E2 82 AC
。
如果您的要求是将Unicode字符“截断”为低8位,则必须“手动”执行此操作,我不知道可以使用的内置编码:
NSMutableData *dataString = [NSMutableData dataWithLength:[yourString length]];
uint8_t *dataBytes = [dataString mutableBytes];
for (NSUInteger i = 0; i < [yourString length]; i++) {
// assigning the character to a uint_8 truncates to the lower 8 bit:
dataBytes[i] = [yourString characterAtIndex:i];
}
答案 2 :(得分:0)
根据您的代码段,您需要执行以下操作:
unsigned char digest[CC_SHA1_DIGEST_LENGTH];
NSData *dataString = [yourString dataUsingEncoding: NSUTF8StringEncoding];
NSMutableString *outString;
if (CC_SHA1([dataString bytes], [dataString length], digest)) {
for (int i=0;i<CC_SHA1_DIGEST_LENGTH;i++) {
[outString appendFormat:@"%02x", digest[i]];
}
}
outString将是你的40-char字符串。
答案 3 :(得分:0)
这里有NSString category用于创建NSString的SHA1哈希值。 Creating SHA1 Hash from NSString