17

byte/short/int/long 配列を ByteBuffer に変換し、バイト配列を取得する簡単な方法を知っています。たとえば、バイト配列を短い配列に変換するには、次のようにします。

byte[] bArray = { 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 };

ByteBuffer bb = ByteBuffer.wrap(byteArray);
ShortBuffer sb = bb.asShortBuffer();
short[] shortArray = new short[byteArray.length / 2];
sb.get(shortArray);

次のような短い配列を生成します[256, 0, 0, 0, 256, 0, 0, 0]

java.nioクラスを使用して逆操作を行うにはどうすればよいですか?

今私はこれをやっています:

shortArray[] = {256, 0, 0, 0, 256, 0, 0, 0};
ByteBuffer bb = ByteBuffer.allocate(shortArray.length * 2);
for (short s : shortArray) {
    bb.putShort(s);
}
return bb.array();

そして、元の[1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]バイト配列を取得します。しかし、手動ループではなく、ShortBuffer.asByteBuffer() のようなメソッドを使用したいと考えています。

2001年のSunへのリクエストを見つけましたが、彼らはそれを受け入れませんでした;-((

4

3 に答える 3

31

これはどうですか?:

    bb.asShortBuffer().put(shortArray);

次にbb、データが含まれます。

完全なコード

public class Test {
    public static void main(final String args[]) {
        short[] arr = { 256, 0, 0, 0, 256, 0, 0, 0 };
        for (byte b : F(arr)) {
            System.out.print(b);
        }
    }

    public static byte[] F(short[] arr) {
        java.nio.ByteBuffer bb = java.nio.ByteBuffer.allocate(arr.length * 2);
        bb.asShortBuffer().put(arr);
        return bb.array(); // this returns the "raw" array, it's shared and not copied!
    }
}
于 2012-07-26T08:56:17.447 に答える
3

さて、宣言では

ShortBuffer sb = bb.asShortBuffer();

私の知る限り、あなたShortBufferは元のビューにすぎませんByteBuffer。したがって、いつでも元のByteBuffer変数にアクセスして、参照bbを通じて変更されたデータを確認できます。CharBuffersb

asCharBufferのドキュメントには次のように書かれています。

[...] このバッファのコンテンツへの変更は新しいバッファに表示され、その逆も同様です [...]

于 2012-07-26T08:26:33.730 に答える
0

ShortBuffer を作成するために使用した ByteBuffer を、同じバッファーへのビューとして覚えています。

それ以外の場合、これを元に戻す唯一の方法は、反射を使用してbbフィールドを取得することです。

ところで:ネイティブバイトオーダーを使用する場合、特に何をしているかによっては、直接 ByteBuffer を使用すると大幅に高速になる可能性があります。

于 2012-07-26T08:26:06.977 に答える