3

我正在使用此代码创建从提供字符串到下放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_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;

}

我的 PHP 代码是

 sha1(json_encode($array));

我有包含阿拉伯语的字符串。

当我从英文字符串创建哈希并将其与Ubuntu*强文本下的php代码创建的哈希进行比较时,结果将是相同的。

但是当我创建带有阿拉伯字符的哈希时,它会将它与从 php 代码创建的哈希进行比较并不会得到结果。

那么这段代码的问题是什么。

谢谢

4

2 回答 2

4

input.length是字符数,不是字节数,区别在于UTF8编码下很多字节都是多字节长度。

代替:

const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData dataWithBytes:cstr length:input.length];

使用 NSString 方法:

NSData *data = [input  dataUsingEncoding: NSUTF8StringEncoding];

不需要中间件const char *cstr

于 2013-09-24T10:55:29.093 回答
1

我发现我的问题来自我的PHP json_encode($array)函数。

所以我在http://php.net/manual/en/function.json-encode.php中找到了这个函数,它用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)

于 2013-09-24T13:45:56.843 回答