Objective c 使用UTF-8字符创建iOS SHA1哈希
我正在使用这段代码创建哈希,从给出字符串到导出IOS应用程序Objective c 使用UTF-8字符创建iOS SHA1哈希,objective-c,hash,utf-8,Objective C,Hash,Utf 8,我正在使用这段代码创建哈希,从给出字符串到导出IOS应用程序 -(NSString*) sha1:(NSString*)input { const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding]; NSData *data = [NSData dataWithBytes:cstr length:input.length]; uint8_t digest[CC_SHA1_DIGEST_LENGTH]; CC_
-(NSString*) sha1:(NSString*)input
{
const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData dataWithBytes:cstr length:input.length];
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes, data.length, digest);
NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", digest[i]];
return output;
}
我有一个包含阿拉伯语语言的字符串
当我从English字符串创建哈希,并将其与Ubuntu*strong text*下从php代码创建的哈希进行比较时,结果将是相同的
但是当我用阿拉伯文字符创建散列时,它会这样做,并将其与php代码创建的散列进行比较,结果不会有什么不同
那么这个代码的人有什么问题呢
感谢输入。长度是字符数,而不是字节数,区别在于UTF8编码下的许多字节的长度是多个字节 替换:
const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData dataWithBytes:cstr length:input.length];
使用NSString方法:
NSData *data = [input dataUsingEncoding: NSUTF8StringEncoding];
不需要中间的
const char*cstr
我发现我的问题来自我的PHP json\u encode($array)函数
因此,我在其中找到了这个函数,它用UTF-8字符编码我的json
function my_json_encode($arr)
{
//convmap since 0x80 char codes so it takes all multibyte codes (above ASCII 127). So such characters are being "hidden" from normal json_encoding
array_walk_recursive($arr, function (&$item, $key) { if (is_string($item)) $item = mb_encode_numericentity($item, array (0x80, 0xffff, 0, 0xffff), 'UTF-8'); });
return mb_decode_numericentity(json_encode($arr), array (0x80, 0xffff, 0, 0xffff), 'UTF-8');
}
例:
sha1(my_json_encode($newArray)您可以发布用于创建哈希的php代码吗?input.length是字符串中的字符数,而不是UTF8编码数据表示形式中的字节数。在将字符串转换为NSData时,您可能会截断字符串。请尝试使用-[NSString dataUsingEncoding:]取而代之的是肯定的:返回sha1(json_encode($array));Mr.iccir您的意思是用NSData*数据替换NSData*数据=[NSData DATAWITHEBYTES:cstr encode:];您确定php使用的是UTF8编码吗?可能是UTF16--或其他编码。请尝试在php阿拉伯语字符串中显示实际字节。
function my_json_encode($arr)
{
//convmap since 0x80 char codes so it takes all multibyte codes (above ASCII 127). So such characters are being "hidden" from normal json_encoding
array_walk_recursive($arr, function (&$item, $key) { if (is_string($item)) $item = mb_encode_numericentity($item, array (0x80, 0xffff, 0, 0xffff), 'UTF-8'); });
return mb_decode_numericentity(json_encode($arr), array (0x80, 0xffff, 0, 0xffff), 'UTF-8');
}