来自字节的负结果

时间:2014-01-20 15:11:55

标签: java objective-c bytearray long-integer unsigned

我在下面有这一行,其中byte [] shaBytes来自SHA1的值。将前四个结果添加到while循环中使用的数字。我正在尝试将objC代码移植到java,而下面的行在几次迭代后导致负值,例如-2063597568。

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

基本上,while循环在

时循环
tVar > 0xFFFFFFFFL >> 11

在objC中,shaBytes是一个unsigned char,用作CC_SHA1中的参数。在objC中,代码将循环700多次迭代,而我的端口只有3,因为tVar变为负数。

1 个答案:

答案 0 :(得分:0)

Java没有无符号字节。所有Java整数类型都已签名。这意味着负字节的左移将是负的:

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

另一方面,如果您将byte转换为long,一切都会好转:

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

要将byte转换为“unsigned”(请记住,Java中没有未签名的东西)long值使用:

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

这样做是因为Java long是64位的,可以处理8位值的24 left shift而没有签名/无符号问题。