gpt4 book ai didi

Java:在原始数组上使用类型双关?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:58:42 29 4
gpt4 key购买 nike

我需要能够将字节数组与其他基本类型数组相互转换,但我需要 type 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 的源代码,发现了几个类,它们被所有这些缓冲类使用并且做我需要的东西,但是是内部的(比如类 Unsafe )。

虽然我认为我的目标可以通过将字节缓冲区包装在一些 ObjectInputStream 中并通过 .readInt() 读取原始值来实现,但我认为它会是一个困惑而缓慢的解决方法。

那么,是否有任何其他可能的解决方案无需执行神奇的原始类型算术(移位、检查字节顺序……)?

注意:我需要两个方向:byte[12] -> int[3] 和 int[3] -> byte[12]

最佳答案

根据 javadoc,array() [1] 返回缓冲区的支持数组,这是您通过调用 wrap() [2] 指定的数组。

因此,您必须创建一个具有所需类型的新数组。但是仍然可以通过 Buffer 类处理算术运算。

ByteBuffer bb = ByteBuffer.wrap(new byte[]{ 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3 });
IntBuffer ib = bb.asIntBuffer();

int[] intArray = new int[ib.limit()];
ib.get(intArray);

倒退需要自己稍微计算一下。

ByteBuffer newBb = ByteBuffer.allocate(intArray.length*4);
newBb.asIntBuffer().put(intArray);
byte[] byteArray = newBb.array();

参见:

[1] http://java.sun.com/javase/6/docs/api/java/nio/ByteBuffer.html#array%28%29

[2] http://java.sun.com/javase/6/docs/api/java/nio/ByteBuffer.html#wrap%28byte[]%29

关于Java:在原始数组上使用类型双关?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2256887/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com