如何将整数转换为字节数组?

3

我试图将 int 转换为 byte[], 并写了以下代码:

byte[] bytes = new byte[4];
ByteBuffer buff = ByteBuffer.allocate(4);
buff.putInt(1222);
buff.get(bytes);

但是结果是我得到了java.nio.BufferOverflowException异常,但没有详细的信息。

对于我来说,代码是有效的。问题出在哪里?如何将int转换为byte[]


你在哪一行遇到了错误? - arminb
buff.get(bytes) - Valentine Zakharenko
4个回答

6

在将数据放入缓冲区后,您忘记了调用flip()方法。

int放入缓冲区后,位置位于缓冲区末尾。尝试读取数据会导致BufferUnderflowException异常(而不是溢出),因为缓冲区中没有剩余的字节可读取。


6
不需要调用flip()函数的相似解决方案。
byte[] bytes = new byte[4];
ByteBuffer.wrap(bytes).putInt(0x12345678);
System.out.println(Arrays.toString(bytes));

打印输出 http://ideone.com/Ab4Z4V

[18, 52, 86, 120]

这是0x12、0x34、0x56和0x78。


3
这是我实现它的方法:
public static byte[] intToByteArray(int value) {
    if ((value >>> 24) > 0) {
        return new byte[]{
            (byte) (value >>> 24),
            (byte) (value >>> 16),
            (byte) (value >>> 8),
            (byte) value
        };
    } else if ((value >> 16) > 0) {
        return new byte[]{
            (byte) (value >>> 16),
            (byte) (value >>> 8),
            (byte) value
        };
    } else if ((value >> 8) > 0) {
        return new byte[]{
            (byte) (value >>> 8),
            (byte) value
        };
    } else {
        return new byte[]{
            (byte) value
        };
    }
}

请记住,这种方法仅使用表示数字所需的字节数,这意味着如果数字很小,则使用更少的字节。

2

与您自己的解决方案类似,但更加简洁,结果直接在字节数组中。

    byte[] bytes = new byte[4];
    // BigEndian
    ByteBuffer.wrap(bytes).putInt(1222);
    // LittleEndian
    ByteBuffer.wrap(bytes).order(LITTLE_ENDIAN).putInt(1222);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接