【发布时间】:2014-08-20 09:32:33
【问题描述】:
我在字节选项卡 (byte[]) 中接收来自 RS422 通信的数据。
我的一些数据是二进制补码,规则如下:
Significant bits Two's complement
MSB LSB
00000000 0
00000001 + LSB
01111111 + MSB - LSB
10000000 - MSB
10000001 - MSB + LSB
11111111 - LSB
要将 byte[] 数据转换为十进制,纯二进制,我使用以下代码:
Byte b05 = new Byte(new Integer(0x7A).byteValue()); // I use those bytes for my test
Byte b06 = new Byte(new Integer(0x00).byteValue());
Byte[] byteTabDay = new Byte[2] ;
byteTabDay[0] = b05 ;
byteTabDay[1] = b06 ;
int valueDay = byteTabDay[1] << 8 | byteTabDay[0] ;
System.out.println("day :" + valueDay); // print 122
但我不知道如何像以前一样转换包含二进制补码数据的 byte[]:
Byte b20 = new Byte(new Integer(0x00).byteValue());
Byte b21 = new Byte(new Integer(0xFF).byteValue());
Byte b22 = new Byte(new Integer(0x3C).byteValue());
理论上,这些数据包含的值(或多或少):1176
所以我需要帮助,因为我不明白如何将包含二进制补码的字节数据转换为十进制。
【问题讨论】:
-
你为什么到处使用盒装类型?不要做
Byte b21 = new Byte(new Integer(0xFF).byteValue());,做byte b21 = (byte) 0xFF; -
我不知道你的“规则”想说什么。您的第一个代码 sn-p 建议了一个微不足道的多字节
int值,但不清楚为什么您在用两个字节到三个字节做同样的事情时会遇到麻烦。您如何得出1176.61254的值?浮点数,真的吗? -
第一个sn-p只能是正值,第二个sn-p可以是负值也可以是正值。没错,我不能有浮点数,所以我的例子是 1176
标签: java byte twos-complement