0

このコードを使用してiPhoneアプリでhash256を生成すると、次のようになります。

 unsigned char hashedChars[32];
  NSString *inputString;
  inputString = [NSString stringWithFormat:@"hello"];
  CC_SHA256([inputString UTF8String],
      [inputString lengthOfBytesUsingEncoding:NSASCIIStringEncoding ], 
      hashedChars);
  NSData * hashedData = [NSData dataWithBytes:hashedChars length:32];

inputStringのhash256は正しく作成されますが、この@ "\ x00 \ x25 \ x53 \ b4"のような文字列を使用すると、hash256は"\x"文字を含む実際の文字列とは異なります。問題はASCIIではなく「UTF8」のエンコードにあると思います。ありがとう!

4

2 に答える 2

1

でバイトを取得しています[inputString UTF8String]が、長さは[inputString lengthOfBytesUsingEncoding:NSASCIIStringEncoding]. これは明らかに間違っています。さらに (「\xB4」を意味し、それが ASCII ではない何かに変わると仮定すると)、「\xB4」は ASCII ではない可能性があります。NSString のドキュメントは言う

指定されたエンコーディングを使用して受信者を変換できない場合は、0 を返します。

したがって、空の文字列のハッシュを計算しています。もちろん、それは間違っています。

データを 1 回だけ生成すると、問題が発生する可能性が低くなります。

NSData * inputData = [inputString dataUsingEncoding:NSUTF8StringEncoding];
CC_SHA256(inputData.bytes, inputData.length, hashedChars);
于 2010-09-13T01:37:48.647 に答える
1

私は最初の文字 "\x00" を疑っています。これは、"通常の C 文字列" を扱っていると思われるものを終了させるものです。

lengthOfBytesUsingEncoding: がそのことを考慮しているかどうかはわかりませんが、私が実験したいものです。

于 2010-09-12T23:20:16.727 に答える