首先对此方法有几个问题,该方法将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();

最佳答案

int占用四个字节,因此您必须分配byte[]四倍于int[]asIntBuffer()ByteBuffer的形式返回IntBuffer的视图,因此将int[]放入IntBuffer会将所有int转换成四个字节,然后将它们放入ByteBuffer中。

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

至于您的最后一个问题,IntBuffer并非int[],从IntBuffer获得的ByteBuffer.asIntBuffer()也不支持array()方法。换句话说,因为实现是基于int[]的,所以没有IntBuffer备份到这样的byte[]

10-01 03:25