バイト配列を他のプリミティブ型配列との間で変換できるようにする必要がありますが、キャストする代わりに、型の 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
残念ながら、コンテンツを「ビットごと」または「生」にコピーして新しい IntBuffer を作成するのでbb.asIntBuffer()
はなく、既存の ByteBuffer に新しい「ビュー」を作成するようです。だからこそ.array()
、失敗することが意図されています。
JDKのソースをブラウズしたところ、これらすべてのバッファクラスで使用され、必要なことを実行するクラスがほとんど見つかりませんでしたが、内部です( class などUnsafe
)。
ObjectInputStream
バイトバッファをラップしてプリミティブ値を読み取ることで目標を達成できると.readInt()
思いますが、面倒で遅い回避策になると思います。
それで、魔法のプリミティブ型の算術演算(シフト、エンディアンのチェックなど)を行わずに可能な他の解決策はありますか?
注: 両方向が必要です: byte[12] -> int[3]、および int[3] -> byte[12]