我知道这里有很多类似的问题,但我有一些奇怪的情况。我想要做的是将byte[4]
转换为int。
这是从int到byte的转换:
int data24bit = 51;
for (int i = 0; i < 3; i++) {
data8bit = (byte)(data24bit & 0x0000FF);
data24bit = data24bit >> 8;
byte_file.put(data8bit);
}
到目前为止还很清楚。之后我想读取这4个字节以取回51。我尝试以不同的方式做到这一点:
读取4个字节:
byte[] bytes = new byte[4];
for (int i = 0; i < 3; i++) {
byte b = dis.readByte();
bytes[i] = b;
}
// bytes[3] = (byte)(0x000000);
将字节转换为int:
int value = 0;
value = ((0xFF & bytes[0]) << 24) | ((0xFF & bytes[1]) << 16) |
((0xFF & bytes[2]) << 8) | (0xFF & bytes[3]);
或
value = ByteBuffer.wrap(bytes).getInt();
或
value = new BigInteger(bytes).intValue();
我总是得到855638016
作为预期51
的结果。
当我调试代码并查看字节数组时,我可以看到以下内容:[51, 0, 0, 0]
。
我做错了什么?
答案 0 :(得分:1)
问题是你用little-endian(最低有效字节优先)写字节,但是假设是big-endian就把它读回来。
写完之后,你的字节数组如下所示:
[51, 0, 0, 0]
然后你试图将它转换回一个整数,就像你的帖子中的这个例子一样:
value = ((0xFF & bytes[0]) << 24)
| ((0xFF & bytes[1]) << 16)
| ((0xFF & bytes[2]) << 8)
| (0xFF & bytes[3]);
如果填写实际值,那么计算基本上是这样的:
value = 51 * 256 * 256 * 256
+ 0 * 256 * 256
+ 0 * 256
+ 0
= 855638016
虽然你真正想要的是这个:
value = 0 * 256 * 256 * 256
+ 0 * 256 * 256
+ 0 * 256
+ 51
= 51
因此固定计算如下:
value = ((0xFF & bytes[3]) << 24)
| ((0xFF & bytes[2]) << 16)
| ((0xFF & bytes[1]) << 8)
| (0xFF & bytes[0]);
答案 1 :(得分:0)
确实很愚蠢,但我没有保留字节顺序。
[51, 0, 0, 0] -> is 855638016
[0, 0, 0, 51] -> is 51