java - 从 Java 字节中提取半字节

标签 java serial-port

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 个字节(十六进制)。 我将所有字节分配给一个字节数组,以便以后使用它们。

我有两个问题:

1] 如何在 Java 中将 4 和 5 个字节重新组合在一起(我假设是 INT)? 2] 如何提取 10 和 11 或者最后一个字节的高半字节和低半字节?

[来自以下评论] 示例字节:高[0101][0110]低 lowNibble = yourbyte & 0x0f; 01010110 & 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.

最佳答案

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;

无符号移位 ( >>> ) 用零填充高位,无论符号如何。

关于java - 从 Java 字节中提取半字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14666214/

相关文章:

c - 如何用中断串口读取串口?

c - 如何在 Linux 上正确设置串口通信

java - 类和子类 - 您如何跟踪它们?

java - 从 JFormattedTextField 获取原始、未格式化、未屏蔽的文本

java - 如何在java中打印List<List<String[]>>的值?

Arduino Nano无串口通信SIM800C

c# - 无法从串口获取所有字符

java - 如何在java中使用JSlider放大和缩小行中的图像?

java - Eclipse中粗体蓝色字体的含义

.net - 在 .NET 中使用 System.IO.Ports.SerialPort 驱动 DTR