2011-10-19 33 views
0

我有這種方法在2個NSStrings之間做一個xor,我在NSLog上打印結果,但它不是期望值。 無法弄清楚我做錯了什麼。Xor在2 NSString之間給出錯誤的結果

(void)XorSecretKeyDeviceId 
{ 
NSString* secretKey = @"123";// 
NSString* deviceId = @"abcdef";// 

NSData* stringKey = [secretKey dataUsingEncoding:NSUTF8StringEncoding]; 
NSData* stringDeviceId = [deviceId dataUsingEncoding:NSUTF8StringEncoding]; 

unsigned char* pBytesInput = (unsigned char*)[stringKey bytes]; //Bytes 
unsigned char* pBytesKey = (unsigned char*)[stringDeviceId bytes]; 

unsigned int vlen = [secretKey length]; //Keys Length 
unsigned int klen = [deviceId length]; 

unsigned int v; 
unsigned int k = vlen % klen; 
unsigned char c; 

for(v = 0; v < vlen; v++) 
{ 
    c = pBytesInput[v]^pBytesKey[k]; 
    pBytesInput[v] = c; 
    NSLog(@"%c", c); 

    k = (++k < klen ? k : 0); 
} 
} 
+0

你爲什麼最初在** vlen%klen **開始k?它的初始值不應該是0嗎?另外,如果您向我們舉例說明了您的程序打印的內容以及您期望打印的內容,這將會很有幫助。 –

+0

它的打印「UWU」應該以十六進制打印「707070」,並且在打印「PPP」時k = 0。所以也許它在k = 0時正常工作。目前我會相信它正常工作,因爲這一點。 – bruno

回答

0

你正確設置你的pBytesInputpBytesKey變量?目前,您有unsigned char* pBytesInput = (unsigned char*)[stringKey bytes];(即輸入是「密鑰」),並且pBytesKey是設備ID。這看起來很奇怪。

另外,請小心使用UTF-8編碼。 UTF-8使用字符串中任何字節的高位來指示多字節字符到下一個字節的「延續」。通過給定設置加密中最後一個字節的高位,你的編碼可能會產生無效的UTF-8。

不止於此,你必須說出「錯誤的結果」是什麼。

+0

是的,我已經切換了不應該是這樣的變量,但是這不會影響最終結果。 – bruno

+0

請問您能澄清您是如何解決問題的?謝謝。 – Lukas1