java - 如何将二进制补码 byte[] 转换为十进制?

标签 java byte twos-complement

我在字节选项卡 (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

所以我需要帮助,因为我不明白如何将包含二进制补码的字节数据转换为十进制。

最佳答案

二进制补码是表示包含负数的数字的标准。

对于三位数:

      Base 2     (One's       Two's
                 complement)  complement
000 =  0
001 =  1
010 =  2
011 =  3
100 =  4             -3         -4
101 =  5             -2         -3
110 =  6             -1         -2
111 =  7             -0         -1

Java 采用二进制补码:最高有效位为 1 表示负数。 同样在 java byte 中,short,int,long 是有符号的。 顺便说一句,您使用了原始类型的对象包装器。原始类型更直接。

byte b05 = (byte) 0x7A;
byte b06 = (byte) 0x00; // MSB, positive as < 0x80

nyte[] byteTabDay = new byte[2];
byteTabDay[0] = b05;
byteTabDay[1] = b06;    

int valueDay  =  ((int) byteTabDay[1]) << 8) | (0xFF & byteTabDay[0]); 
System.out.println("day :" + valueDay); // print 122

必须做的:保留最高有效字节的符号扩展,但对于其他字节,通过用 0xFF 屏蔽它们来将它们保持为 8 位。

关于java - 如何将二进制补码 byte[] 转换为十进制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25401307/

相关文章:

java - onTouchEvent() 没有按我的预期工作

java - Scanner.nextLine 输入无法匹配字符串

java - 确定 ByteBuffer 中的字节数

c - 为什么要添加填充,如果 char 在 int 之后?

C++ 字节到位转换然后打印

c++ - 二进制补码函数的问题

java - Spring webflow booking-faces 项目中 import.sql 的名称是否重要

java - Trie数据结构的insert方法

c - 带符号的十六进制字符串到 long int 函数

javascript - 在 javascript (node js) 中解释 16 位二进制补码