2013-02-02 70 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