ASCII では 0x30 = '0' であることに注意してください。16ビットを16進数の2バイトとして送信しているように見えます。最初にビット0〜7、次に8〜15です。つまり、送信したい
- ビット 4 ~ 7 の 16 進数
- ビット 0 ~ 3 の 16 進数
- ビット 12 ~ 15 の 16 進数
- ビット 8 ~ 11 の 16 進数
確認するにはさらにデータ ポイントが必要ですが、これは上記の例に適合します。
bit 0 set encodes to string "0100" = 0x30 0x31 0x30 0x30
bit 1 set "0200" = 0x30 0x32 0x30 0x30
bit 2 set "0400" = 0x30 0x34 0x30 0x30
0+2 "0500" = 0x30 0x30 0x30 0x30
0+9 "0102" = 0x30 0x31 0x30 0x32
0,1,2,3,4,5,9 "3F02" = 0x33 0x46 0x30 0x32
つまり、Java では、ビットが単一の整数にあるn
場合、おそらく必要な場合があります
String output = Integer.toHexString((n >> 4) & 0xf)
+ Integer.toHexString(n & 0xf)
+ Integer.toHexString((n >> 12) & 0xf)
+ Integer.toHexString((n >> 8) & 0xf);
byte[] data = output.toUpperCase().getBytes("ASCII");
文字列を介して、または
byte[] data = new byte[4];
data[0] = (byte)((n >> 4) & 0xf);
data[1] = (byte)(n & 0xf);
data[2] = (byte)((n >> 12) & 0xf);
data[3] = (byte)((n >> 8) & 0xf);
for(int i = 0; i < 4; ++i) {
data[i] += (data[i] < 10) ? '0' : ('A' - 10);
}
弦を避けます。
4バイトを解析して単一のintに戻すには、次を使用できます
int bits = (((data[0] & 0xf) + ((data[0] >= 'A') ? 9 : 0)) << 4)
| ((data[1] & 0xf) + ((data[1] >= 'A') ? 9 : 0))
| (((data[2] & 0xf) + ((data[2] >= 'A') ? 9 : 0)) << 12)
| (((data[3] & 0xf) + ((data[3] >= 'A') ? 9 : 0)) << 8);
明らかに、ここでは入力チェックはありません。期待される形式で入力を取得すると仮定しています。括弧内のメイン ビットは、文字列から単一の 16 進数を解析するだけです。必要に応じて、それをリファクタリングするか、より堅牢なものを実装できます。