java - 如何将 14 位二进制补码值转换为 Integer 或 Short 并在 Java 中维护符号

标签 java byte arrays

我有一个 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/

相关文章:

java - 如何使用 webdriver 打开新选项卡并在其中输入地址

Python 0xff 字节

Java将4个字节转换为单个变量

arrays - 二进制搜索只使用长度?

java - 根据字符串标识符检查对象字段

java - 多模块项目中测试类的正确位置是什么?

java - 如何使用 JitPack 从 GitHub 获取最新版本?

Java Bytebuffer只能顺序读取?

javascript - 在 JSON 数组 Javascript 中访问 JSON 对象

java - 将 ArrayList<int[]> 转换为 int[][]