2013-02-02 71 views
0
Hex:[0A][52][08][01][01][01][00][CD][21][02][59] 


0  [0A] 
1  [52]   Packettype = TEMP_HUM 
2  [08]   subtype  = TH8 - 
3  [01]   Sequence nbr = 1 
4/5 [01][01]  ID   = 257 
6/7 [00][CD]  Temperature = 20.5 °C 
8  [21]   Humidity  = 33 
9  [02]   Status  = Dry 
10  [5] *nibble   Signal level = 5 
11  [9] *nibble   Battery  = OK 

因此,我通過串口獲得了11個字節(十六進制)。 我將所有字節分配給一個字節數組,以便稍後使用它們。從Java字節中提取半字節

我有兩個qestions:

1]我如何能在4 & 5個字節組合到一起在Java中(我假設在INT)? 2]如何提取10和11或最後一個字節的高位和低位?

[FROM COMMENTS下文] 例字節:高[0101] [0110]低 lowNibble = yourbyte &爲0x0F; 爲0x0F(00001111)= 00000110

  highNibble = yourByte >>>> 4 
      01010110 >>> 4 = 00000101 


      IF you use this Example Byte: High[1101][0110]Low 
      highNibble = yourByte >>> 4 
      11010110 >>> 4 = 00000101 
      Because >>> removes the signed bit. 
+0

其實我只知道如何將簽名字節變成無符號字節int anUnsignedByte =(int)b & 0xff;但我真的不知道發生了什麼。 – DevilCode

+0

是的。請注意它是>>>而不是>>>> – Eduardo

回答

3

1)這取決於字節序。它要麼是(b[4] << 8) | b[5](b[5] << 8) | b[4]

2)lowNibble = yourByte & 0x0f; highNibble = (yourByte >> 4) & 0x0f;

您也可以這樣做:lowNibble = yourByte & 0x0f; highNibble = yourByte >>> 4;

無符號偏移(>>>)填充上位與零個,無論正負。

+0

Byte = 11111111通過做&0x0F你得到00001111 Byte = 11111111通過做>> 4你得到11110000然後0x0f做什麼?對不起,只是沒有清楚地認識到它。 – DevilCode

+0

通過做11111111 >> 4你得到10001111,因爲這個標誌。用0x0f來擺脫由符號引起的問題。注意01111111 >> 4 = 00000111,因爲符號位未被設置。 – Eduardo

+0

字節:高[0101] [0110]低 lowNibble = yourbyte & 0x0f; 01010110&爲0x0F(00001111)= 00000110 highNibble = yourByte >>>> 4 01010110 >>> 4 = 00000101 IF字節:高[1101 ] [0110]低 highNibble = yourByte >>> 4 11010110 >>> 4 = 00000101 因爲>>>移除了有符號位。 – DevilCode