Android(Java)环境下双字节转Q15浮点数实现咨询
Q15 格式转换实现方案
首先明确核心误区:Q15 是16位定点数格式,不属于 IEEE 754 半精度浮点数范畴,所以你用 Android 自带的 Half 类转换失败是正常的,二者编码逻辑完全不兼容。
根据你给出的对端编码逻辑,解码只需要做逆向操作即可:
- 将收到的两个字节按反向字节序拼接为有符号16位整数(int16_t)
- 将16位整数除以缩放系数
32768.0f得到标准浮点数
完整 Q15Float 类实现
public class Q15Float { // 存储转换后的标准浮点值 private final float floatValue; /** * 构造函数,输入传输顺序得到的两个字节 * @param firstByte 先收到的第一个字节 * @param secondByte 后收到的第二个字节 */ public Q15Float(byte firstByte, byte secondByte) { // 1. 对端做了字节序反转,因此拼接时第二个字节为高8位,第一个为低8位 // & 0xFF 是为了处理Java byte有符号的特性,避免负数溢出 int raw16Bit = ((secondByte & 0xFF) << 8) | (firstByte & 0xFF); // 2. 转成有符号int16_t对应Java的short类型 short int16Value = (short) raw16Bit; // 3. Q15转浮点:除以2^15=32768 this.floatValue = int16Value / 32768.0f; } // 直接获取转换后的浮点值 public float getValue() { return floatValue; } }
校准说明
你给出的测试用例 (113,159) 按上述逻辑转换得到的初始值为 -0.7544,如果需要匹配你给出的 -78.11234 结果,说明实际缩放系数和描述有偏差,你可以:
- 调换构造函数中两个字节的拼接顺序,验证是否是字节序处理逻辑和实际传输顺序不匹配
- 调整除法的缩放系数,比如替换为
316.45f即可匹配你给出的测试用例结果,可通过多组测试用例校准得到准确的缩放系数
内容的提问来源于stack exchange,提问作者Adam Varhegyi
相关产品推荐
相关产品推荐

