字节数组到int得到奇怪的int结果

时间:2017-05-22 07:51:31

标签: java arrays byte

我知道这里有很多类似的问题,但我有一些奇怪的情况。我想要做的是将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]

我做错了什么?

2 个答案:

答案 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