請注意,0x30 = ASCII中的'0'。它看起來像你對我要傳遞的16位十六進制的兩個字節,與0-7位第一和第二8-15,也就是說你想傳遞的4-7位
- 十六進制數字對於位8-11位
- 十六進制數字0-3
- 十六進制數字的位12-15
- 十六進制數字
我們會需要更多的數據點,可以肯定的,但這種適合你上面的例子:
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);
}
避免串。
爲了解析四個字節返回到單個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);
顯然沒有輸入檢查這裏 - 我假設,我們得到預期的格式輸入。括號中的主要內容應該只是解析字符串中的一個十六進制數字 - 您可以重構它或者實現更強大的功能。
來源
2012-04-05 09:19:23
Rup
您的「0位檢查=> 0x30,0x31,0x30,0x30」示例背後的邏輯是什麼? – 2012-04-05 08:47:52
我使用win程序,向打印機發送命令,並從COM端口監視API中捕獲此示例。 – smie 2012-04-05 08:50:27
我們無法理解它。你能向我們展示更多可能的組合和例子嗎? – adarshr 2012-04-05 08:56:15