我需要能够将字节数组转换为其他原始类型数组/从其他原始类型数组转换,但我需要类型 punning而不是强制转换。没有强制转换的原始副本的正确术语?
我认为可以执行以下操作:
// idea: byte[12] -> int[3], and int[3] -> byte[12]
int[] ints;
ByteBuffer bb = ByteBuffer.wrap(
new byte[]{ 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3 });
IntBuffer ib = bb.asIntBuffer();
ints = ib.array(); // java.lang.UnsupportedOperationException
ints = ib.duplicate().array(); // java.lang.UnsupportedOperationException
不幸的是,似乎bb.asIntBuffer()
不是通过“按位”或“原始”复制内容来创建新的 IntBuffer,而是在现有 ByteBuffer 上创建新的“视图” 。这就是为什么.array()
打算失败。
我浏览了 JDK 的源代码,发现了一些类,所有这些缓冲区类都使用这些类并且可以做我需要的东西,但是是内部的(例如 class Unsafe
)。
虽然我认为可以通过将字节缓冲区包装在一些中ObjectInputStream
并通过读取原始值来实现我的目标.readInt()
,但我认为这将是一个混乱且缓慢的解决方法。
那么,如果不进行神奇的原始类型算术(移位、检查字节序……),还有其他可能的解决方案吗?
注意:我需要两个方向:byte[12] -> int[3] 和 int[3] -> byte[12]