2

我正在尝试从 7 字节数组中提取前 49 位。我使用掩码和位移来接近这个字节,如下所示:

long byteVal = ((decryptedVCW[6] & 0xff)&((decryptedVCW[6] & 0xff)<<7)) | ((decryptedVCW[5] & 0xff) << 8) | ((decryptedVCW[4] & 0xff) << 16) | ((decryptedVCW[3] & 0xff) << 24) | ((decryptedVCW[2] & 0xff) << 32) | ((decryptedVCW[1] & 0xff) << 40) | ((decryptedVCW[0] & 0xff) << 48);

其中decryptedVCW 是一个56 位字节数组。

屏蔽和位移按预期工作,直到 32 位移位'<<32'。

例如,decryptedVCW 的十六进制为 E865037A9C6424,其二进制为:

11101000011001010000001101111010100111000110010000100100

当我执行上述移位时,我得到 7AFC6503 二进制:

1111010111111000110010100000011

有谁知道为什么移位在 32 向上分崩离析以及如何解决这个问题?

非常感谢 Shiv

4

1 回答 1

5

decryptedVCW[2] & 0xffis的类型int,因为第一个操作数是byte,第二个是int文字。

当运算符的第一个操作数<<int时,你正在移动一个int,所以如果第二个操作数是 32,你会int溢出。

您可以将运算符的第一个操作数<<转换为long

(((long)(decryptedVCW[2] & 0xff)) << 32)

或者您可以按照@shmosel 的建议,通过在操作中long使用long文字来强制第一个操作数为 a :&

(decryptedVCW[2] & 0xFFL) << 32
于 2016-01-12T08:27:55.423 回答