将 2 的补码字节转换为 Java 中的无符号正值

Edw*_*win 1 java android byte bytearray twos-complement

我在 Java 中有一个 8 位字节数组。字节数组由它从外部传感器接收的 16 位数字的高字节和低字节组成。

例如,字节数组可能如下所示:

00 00 00 01 00 02 00 03
0  1  2  3  4  5  6  7
Run Code Online (Sandbox Code Playgroud)

在上面的字节数组中,每个偶数索引是一个 16 位数字的高字节,每个奇数索引是低字节。

我遇到的问题是当数字大于 127 时,导致数字的 2 的补码表示占上风。我真正想做的是保留 POSITIVE 无符号数。因此我不关心 2 的补码。这是我尝试做但没有成功的事情。

byte[] buffer = new byte[1024]; 

//SOME CODE SNIPPET THAT PUTS NUMBERS B/W 0-500 INTO THE BUFFER RANDOMLY

for(int i = 0; i < 1024; i+=2) {
    int twoByte = 0;
    short high = 0, low = 0;
    high = (short)buffer[i];
    low = (short)buffer[i+1];
    twoByte = ((high << 8) | low);
    System.out.println(twoByte);
}
Run Code Online (Sandbox Code Playgroud)

我试图转换为 short 以使 8 位数字无符号,但似乎 java 截断了前导 0 的广告将其视为 8 位并保留负号。有谁知道也许更好的方法?

## 编辑:我不知道这是否重要,但值得一提的是,这是一个在 Android 上运行的应用程序。##

干杯,

Vin*_*rat 5

尝试:

int high = ((int)buffer[i]) & 0xff;
int low = ((int)buffer[i+1]) & 0xff;

int twoBytes = (high << 8) | low;
Run Code Online (Sandbox Code Playgroud)

示例代码:

byte[] buffer = new byte[] { (byte) 0x16, (byte) 0xfa };

int high = ((int)buffer[0]) & 0xff;
int low = ((int)buffer[1]) & 0xff;
int twoBytes = (high << 8) | low;
Run Code Online (Sandbox Code Playgroud)

价值观:

buffer   = [ 22, -6 ]
high     = 22
low      = 250
twoBytes = 5882 
Run Code Online (Sandbox Code Playgroud)

5882 是 0x16fa 作为十六进制,它可以工作。

检查您是否正确地从传感器读取了字节。