需要帮助理解int数组到字节数组方法和Little / Big Endian想知道吗?

时间:2013-01-29 02:58:51

标签: java buffer bytearray endianness bytebuffer

有几个问题,首先是这个方法,将int[]转换为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_ENDIANLITTLE_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_ENDIANLITTLE_ENDIAN只是规定字节是如何排序的,但为什么要定义一个字节序呢?为什么不只是这个?

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

2 个答案:

答案 0 :(得分:2)

int占用四个字节,因此您必须分配byte[]四倍于int[]的时间。 asIntBuffer()会将ByteBuffer的视图作为IntBuffer返回,因此将int[]放入IntBuffer会将所有int转换为四个字节每个并将它们放入ByteBuffer

Endianness定义int的四个字节写入ByteBuffer的顺序。

关于您的上一个问题,IntBuffer不是int[]IntBuffer获得的ByteBuffer.asIntBuffer()也不支持array()方法。换句话说,此类int[]没有后备IntBuffer,因为实施基于byte[]

答案 1 :(得分:2)

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]