11

UDP パケットからuint8 (符号なし 8 ビット整数)が入ってきます。Java は署名されたプリミティブのみを使用します。このデータ構造をJavaで正しく解析するにはどうすればよいですか?

4

5 に答える 5

26

単純にバイトとして読み取ってから、int に変換します。

byte in = udppacket.getByte(0); // whatever goes here
int uint8 = in & 0xFF;

そうしないと、ビット 8 が 1 に設定された値が負の int に変換されるため、ビットマスクが必要です。例:

This:                                   10000000
Will result in: 11111111111111111111111110000000

そのため、後でビットマスク 0xFF を適用すると、先頭の 1 がキャンセルされます。ご参考までに:0xFF == 0b11111111

于 2012-12-28T14:58:23.330 に答える
5

0xFF & number数値を符号なしバイトとして扱います。しかし、結果の型はint

于 2012-12-28T14:57:43.247 に答える
5

8ビットをaに格納できbyte ます。本当にそれを符号なし値に変換する必要がある場合(そしてしばしば変換しない場合)、マスクを使用できます

byte b = ...
int u = b & 0xFF; // unsigned 0 .. 255 value
于 2012-12-28T14:57:46.630 に答える
3

次のようなことができます。

int value = eightBits & 0xff;

&演算子 (Java のすべての整数演算子と同様) は、(符号ビットを符号拡張することによって) にアップキャストしますeightBitsintこれにより 0x7f より大きい値が負のint値に変わるため、下位 8 ビットを除くすべてをマスクする必要があります。

于 2012-12-28T14:58:05.320 に答える
1

符号なしバイトのすべての値を保持するのに十分な範囲を持つashortまたはに単純に解析できます。int

于 2012-12-28T14:59:04.323 に答える