3

有几个问题,首先是关于这个方法,它将 a 转换int[]为 a byte[]

public static byte[] intToByte(int[] input){
    ByteBuffer byteBuffer = ByteBuffer.allocate(input.length * 4);
    IntBuffer intBuffer = byteBuffer.asIntBuffer();
    intBuffer.put(input);
    byte[] array = byteBuffer.array();
    return array;
}

我正在制作游戏,我必须通过套接字发送一个字节数组,我喜欢这种方法,因为它基本上可以工作,但我不喜欢使用任何我不真正理解它在做什么的东西,所以你能给我一些见解这个方法在做什么?我相信它首先为比特创造了足够的空间,但为什么它的长度会“乘以”四?intBuffer 是否连接到 byteBuffer?因为如果不是,你为什么需要所有 Intbuffer 的东西。

好的,最后一个问题,与BIG_ENDIANvs.有什么关系LITTLE_ENDIAN?例如,在我的其他方法中,将字节数组转换为 int 数组,包含有什么好处.order(BIG_ENDIAN)

public static int[] byteToInt(byte[] input){
   IntBuffer intBuf = ByteBuffer.wrap(input).order(ByteOrder.BIG_ENDIAN).asIntBuffer();
   int[] array = new int[intBuf.remaining()];
   intBuf.get(array);
   return array;
}

我知道BIG_ENDIAN并且LITTLE_ENDIAN只是指定字节的顺序,但为什么还要定义字节序呢?为什么不只是有这个?

IntBuffer intBuf = ByteBuffer.wrap(input).asIntBuffer();
4

2 回答 2

3

IntBuffer 是 byteArray 的字节数组的 int 视图。使用 IntBuffer 的目的是它的 put(int[]) 允许一次性输入 int 数组。事实上,你可以不用 IntBuffer 作为

    ByteBuffer byteBuffer = ByteBuffer.allocate(input.length * 4);
    for(int i : input) {
        byteBuffer.putInt(i);
    }
...

结果是一样的。

这演示了 BigEndian(默认)和 LittleEndian 之间的区别

        int[] input = {1,2,3,4};
        ByteBuffer byteBuffer = ByteBuffer.allocate(input.length * 4);
//      byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
        for(int i : input) {
            byteBuffer.putInt(i);
        }
        byte[] array = byteBuffer.array();
        System.out.println(Arrays.toString(array));

输出

[0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4]

取消注释byteBuffer.order(ByteOrder.LITTLE_ENDIAN);,输出将是

[1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0]
于 2013-01-29T05:11:20.367 回答
2

Anint占用 4 个字节,因此您必须分配byte[]4 倍于int[]. asIntBuffer()返回 a 的视图ByteBufferIntBuffer因此将sint[]放入IntBuffer将所有ints 转换为每个 4 个字节并将它们放入ByteBuffer.

Endianness 定义了将 an 的四个字节int写入ByteBuffer.

至于你的最后一个问题, anIntBuffer不是 an int[],也不是 anIntBuffer获得 fromByteBuffer.asIntBuffer()支持该array()方法。换句话说,没有支持int[]这样的 a IntBuffer,因为实现是基于 a byte[]

于 2013-01-29T03:06:58.683 回答