1

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

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

00 00 00 01 00 02 00 03
0  1  2  3  4  5  6  7

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

我遇到的问题是当数字大于 127 时,导致数字的 2 的补码表示占上风。我真正想做的是保持正数无符号数。因此我不关心 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);
}

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

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

干杯,

4

2 回答 2

5

尝试:

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

int twoBytes = (high << 8) | low;

示例代码:

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;

价值观:

buffer   = [ 22, -6 ]
high     = 22
low      = 250
twoBytes = 5882 

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

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

于 2012-11-14T08:25:07.767 回答
2

要将数字从二进制补码转换为无符号数:

if(x<0)
{
    x=256+x;
}
于 2012-11-14T08:27:58.487 回答