我在下面有这一行,其中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变为负数。
答案 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
而没有签名/无符号问题。