1

私は、ashortを2バイトに変換する必要があるJavaプログラムに取り組んでいます(データパケットにパックされます)。を使用しByteBufferて変換を実行していますが、動作しているように見えますが、明らかなバイトパディングが見られますが、これはよくわかりません。

これが私が書いた簡単な例です:

import java.lang.*;
import java.io.*;
import java.nio.ByteOrder;
import java.nio.ByteBuffer;

public class Test {
    public static void main(String args[]) {
        short i = 27015;
        String s = Integer.toHexString(i);

        System.out.println( "i = " + i );
        System.out.println( "s = " + s );
        System.out.println( "---" );

        ByteBuffer b = ByteBuffer.allocate(2);
        b.order(ByteOrder.BIG_ENDIAN);
        b.putShort(i);

        System.out.printf("0x%H\n", b.getShort(0));
        System.out.println( "---" );

        byte[] a = b.array();

        for( int j = 0; j < a.length; j++ )
            System.out.printf("a[" + j + "] = 0x%H\n", a[j]);

        System.exit(0);
    }
}

このプログラムは、次の出力を生成します。

i = 27015
s = 6987
---
0x6987
---
a[0] = 0x69
a[1] = 0xFFFFFF87

ByteBufferを配列に変換するとbyte、2 番目のバイトが 0xFF でパディングされるのはなぜですか? 0x87配列の 2 番目の要素は の代わりにする必要があるようです0xFFFFFF87。何か不足していますか?

ありがとう!

4

2 に答える 2

1

ByteBuffer がバイト配列に変換されると、2 番目のバイトが 0xFF でパディングされるのはなぜですか?

印刷する%Hと、バイトがintにキャストされます。これは、この多くのビットを持つ ByteBuffer 内のバイトではなく、印刷される方法です。代わりに使用することをお勧めしByte.toHexString(a[j])ます。

于 2013-08-05T15:09:13.453 に答える
0

代わりにこれを試してください:

for (int j = 0; j < a.length; j++)
   System.out.printf("a[" + j + "] = 0x%H\n", ((int) a[j]) & 0xFF);

この& 0xFF操作は、int への変換後に作成される上位 3 バイトをカットします。

参考までに、次の((int) a[j]) & 0xFFように記述でき、a[j] & 0xFFまったく同じようにコンパイルされます。しかし、何が起こっているのかを明確にするために、最初はそのように書きました。

于 2013-08-05T15:12:57.137 に答える