在Objective-C中,我生成了一个简单的MD5哈希“HelloKey”,它返回0FD16658AEE3C52060A39F4EDFB11437
。不幸的是,我无法获得原始返回,因此我必须使用此字符串来获取原始MD5哈希(或者您知道我如何从一开始就获得原始结果吗?)
无论如何,为了将其转换为raw,我将其分成每个2个字符的块,计算十六进制值,并将带有该值的字符追加到字符串。
这是功能:
- (NSString *)hex2bin:(NSString *)input{
NSString *output = @"";
for (int i = 0; i < input.length; i+=2){
NSString *component = [input substringWithRange:NSMakeRange(i, 2)];
unsigned int outVal;
NSScanner* scanner = [NSScanner scannerWithString:component];
[scanner scanHexInt:&outVal];
/* if(outVal > 127){
outVal -= 256;
} */
// unsigned char appendage = (char)outVal;
output = [NSString stringWithFormat:@"%@%c", output, outVal];
NSLog(@"component: %@ = %d", component, outVal);
}
return output;
}
当我打印每个outval时,我得到:
0F = 15
D1 = 209
66 = 102
58 = 88
AE = 174
E3 = 227
C5 = 197
20 = 32
60 = 96
A3 = 163
9F = 159
4E = 78
DF = 223
B1 = 177
14 = 20
37 = 55
然而,当我用一个特殊的函数打印我得到的字符串时,告诉我每个字符的整数值(这里显示的函数):
- (NSString *)str2bin:(NSString *)input{
NSString *output = @"";
for (NSInteger charIdx=0; charIdx < input.length; charIdx++){
char currentChar = [input characterAtIndex:charIdx];
int charNum = [NSNumber numberWithChar:currentChar].intValue;
output = [NSString stringWithFormat:@"%@ %d", output, charNum];
}
return output;
}
我得到:15 20 102 88 -58 30 72 32 96 -93 -4 78 2 -79 20 55
。您会注意到存在显着差异,例如209 - &gt; 20,174-&gt; -58,227 - &gt; 30.在某些情况下,差异是256,所以没有造成伤害。但在其他情况下,它不是,我真的想知道出了什么问题。有什么提示吗?
答案 0 :(得分:0)
你做错了,因为你试图在NSString中存储二进制数据,这是UTF8字符串。 您应该使用NSData(或C字符串)来存储二进制哈希表示。