3

を に変換するこのメソッドについて、最初にいくつか質問が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;
}

私はゲームを作っており、ソケットを介してバイト配列を送信する必要があります。この方法は基本的に機能するので気に入っていますが、何をしているのか本当に理解していないものは使用したくありません。このメソッドは何をしていますか?最初にビットに十分なスペースを作成すると思いますが、なぜ長さの 4 倍を行うのでしょうか? また、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_ENDIANLITTLE_ENDIANいて指示するだけですが、なぜエンディアンを定義するのですか? なぜこれを持っていないのですか?

IntBuffer intBuf = ByteBuffer.wrap(input).asIntBuffer();
4

2 に答える 2

3

IntBuffer は、byteArray のバイト配列の int ビューです。IntBuffer を使用する目的は、入力 int 配列を一度に許可する put(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]
于 2013-01-29T05:11:20.367 に答える
2

は4 バイトを使用するため、 を の4 倍の長さでint割り当てる必要があります。 は のビューをとして返すので、 を に入れると、すべての がそれぞれ 4 バイトに変換され、 に入れられます。byte[]int[]asIntBuffer()ByteBufferIntBufferint[]IntBufferintByteBuffer

intエンディアンは、 の 4 バイトが に書き込まれる順序を定義しますByteBuffer

最後の質問については、 anIntBufferint[]ではなく、IntBuffer得られた はメソッドをByteBuffer.asIntBuffer()サポートしていません。つまり、実装は に基づいているため、そのような をarray()裏付けるものはありません。int[]IntBufferbyte[]

于 2013-01-29T03:06:58.683 に答える