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 上运行的应用程序。##
干杯,
尝试:
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 作为十六进制,它可以工作。
检查您是否正确地从传感器读取了字节。