2010-09-12 81 views
0

當我使用這個代碼在我的iPhone應用程序生成hash256:問題與目標C 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「字符的實際字符串不同。 我認爲問題出在編碼「UTF8」,而不是ascii。 謝謝!

+0

你不缺少在X @ 「\ X00 \ X25 \ X53 \ B4」?不應該是@「\ x00 \ x25 \ x53 \ xb4」。 – 2010-09-12 22:46:20

+0

嗨pakzip,考慮到你真正想解決的問題之一是你的意見之一是Python實現和Objective-C之間的區別。所以我建議你在你的問題中加入以下信息:(1)「正確」例子的輸入和輸出,正確的意思是Python和Objective-C同意。 (2)「錯誤」示例的輸入和輸出(顯示輸入和Obj-C輸出以及Python輸出)。 (3)python源碼。有了這些信息,我們應該能夠幫助你! – idz 2012-05-30 09:11:48

回答

1

我會懷疑第一個字符「\ x00」 - 那會終止任何認爲它處理「常規C字符串」的東西。

不確定lengthOfBytesUsingEncoding:是否考慮到了這些內容,但是我會嘗試使用它。

+0

問題是:如果我嘗試插入「\ x」字符,則生成的sha256不正確,如果我用這些字符記錄字符串,則不同於用python編寫的相等字符串。請原諒我的蹩腳英語。 – pascalbros 2010-09-13 02:01:31

1

您得到的字節數爲[inputString UTF8String],但長度爲[inputString lengthOfBytesUsingEncoding:NSASCIIStringEncoding]。這顯然是錯誤的。此外(假設你的意思是「\ xB4」,並且它變成了不是ASCII的東西),「\ xB4」不可能是ASCII。爲NSString的文檔說

返回0,如果指定的編碼不能用來接收

所以你計算空字符串的哈希轉換。當然這是錯誤的。

你就不太可能有問題,如果你只產生一次數據:

NSData * inputData = [inputString dataUsingEncoding:NSUTF8StringEncoding]; 
CC_SHA256(inputData.bytes, inputData.length, hashedChars); 
+0

無論如何,散列是不正確的。有任何想法嗎? – pascalbros 2010-09-13 15:48:23

+0

我發佈了我的想法。 – 2010-09-22 23:11:59