2014-01-20 75 views
0

我在下面的這一行中,來自SHA1的值爲byte [] shaBytes。將前四個結果添加到一個在while循環中使用的數字中。我試圖將一個objC代碼移植到java,而下面一行經過多次迭代後,結果爲負值,例如-2063597568。來自字節的負面結果

long tVar = (shaBytes[0] << 24) + (shaBytes[1] << 16) + (shaBytes[2] << 8) + (shaBytes[3] << 3); 

因此,基本上,在while循環迴路時

tVar > 0xFFFFFFFFL >> 11 

在objC shaBytes是其被用作在CC_SHA1參數無符號的字符。在objC中,代碼會循環700次以上,而我的端口只有3次,因爲tVar變爲負值。

回答

0

Java沒有無符號字節。所有的Java整數類型都被簽名。這意味着負字節的左移將是負面的:

byte b = -30; 
long x = b << 24; 
System.out.printf("x = %d\n", x); 
// prints -503316480 

。如果轉換bytelong另一方面everything'll還好轉出:

byte b = -30; 
long x = (b & 0xffL) << 24; 
System.out.printf("x = %d\n", x); 
// prints 3791650816 

要轉換byte爲「無符號「(記住,沒有在Java中沒有無符號的東西)long值使用:

long tVar = ((shaBytes[0] & 0xffL) << 24) + ((shaBytes[1] & 0xffL) << 16) + etc 

這會工作b因爲Java long是64位,並且可以處理24 left shift的8位值,而無需簽署/未簽名的問題。

+0

這工作!現在我正在構建的java代碼與objC對應的代碼同步工作。謝謝! – naz