有几个问题,首先是这个方法,将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();
答案 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]