首先对此方法有几个问题,该方法将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_ENDIAN
与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();
最佳答案
int
占用四个字节,因此您必须分配byte[]
四倍于int[]
。 asIntBuffer()
以ByteBuffer
的形式返回IntBuffer
的视图,因此将int[]
放入IntBuffer
会将所有int
转换成四个字节,然后将它们放入ByteBuffer
中。
字节序定义int
的四个字节写入ByteBuffer
的顺序。
至于您的最后一个问题,IntBuffer
并非int[]
,从IntBuffer
获得的ByteBuffer.asIntBuffer()
也不支持array()
方法。换句话说,因为实现是基于int[]
的,所以没有IntBuffer
备份到这样的byte[]
。