0

Objective-C では、「HelloKey」の単純な MD5 ハッシュを生成します0FD16658AEE3C52060A39F4EDFB11437。残念ながら、生のリターンを取得できなかったので、この文字列を処理して生の MD5 ハッシュを取得する必要があります (または、最初から生の結果を取得する方法を知っていますか?)

とにかく、生に変換するために、それぞれ2文字のチャンクに分割し、16進値を計算し、その値を持つ文字を文字列に追加します。

関数は次のとおりです。

- (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 -> 20、174 -> -58、227 -> 30 のように大きな違いがあることに気付くでしょう。場合によっては、違いが 256 であるため、害はありません。しかし、それ以外の場合はそうではありません。何が問題なのかを知りたいのです。任意のヒント?

4

1 に答える 1

0

UTF8文字列であるNSStringにバイナリデータを保存しようとしているため、間違っています。バイナリ ハッシュ表現を格納するには、NSData (または C 文字列) を使用する必要があります。

于 2013-05-17T14:23:15.703 に答える