我有一个 14 位二进制补码值以字节数组的形式从蓝牙设备发送到我的 Java 应用程序。
我无法更改从蓝牙设备发送的数据格式。
如何将此值转换为 Integer 或 Short 并保持符号?
我尝试过的一些东西是
Short x = ByteBuffer.wrap(value).getShort();
Integer x = (short)(value[3] & 0xff) | (short)((value[2] << 8) & 0xff00);
我认为我在上面的代码中遇到的问题是当我收到一个负数时,例如
-8192 (in two's complement 10 0000 0000 0000)
因为接收数据类型是 16 位,所以它期望取反值的位是 16,但实际接收到的是
0010 0000 0000 0000
它认为这是 8192 而不是 -8192。
最佳答案
简单地从字节数组中提取数字,完全忽略符号和多余的位:
byte[] data = ...
int rawNum = ((data[0] & 0xFF) << 8) | (data[1] & 0xFF);
现在 左 将原始值移动(类型大小 - 有效位数),然后使用带符号的移位运算符右移
int realNum = (rawNum << (32 - 14)) >> (32 - 14);
这将首先通过左移将符号位移动到存储值类型的符号位(此处:int),然后在右移时复制符号位 shift-distance 时间(由移位运算符定义) .
关于java - 如何将 14 位二进制补码值转换为 Integer 或 Short 并在 Java 中维护符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26549663/