请注意,ASCII码中的0x30等同于字符'0'。根据我看到的情况,你正在以十六进制的形式传输这16个比特位,并将其分为两个字节,其中第一个字节包含0-7位,第二个字节包含8-15位,即您要传输以下内容:
- 位于4-7的十六进制数字
- 位于0-3的十六进制数字
- 位于12-15的十六进制数字
- 位于8-11的十六进制数字
需要更多数据点才能确定,但这符合您上面的示例。
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中,如果您的位(bits)存储在单个整数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);
}
避免字符串。
要将这四个字节解析回一个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);
显然这里没有输入检查 - 我假设我们以预期的格式获取输入。括号中的主要部分只需从字符串中解析出一个十六进制数字 - 如果您想要,可以重构它或实现更稳健的内容。