You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android(Java)环境下双字节转Q15浮点数实现咨询

Q15 格式转换实现方案

首先明确核心误区:Q15 是16位定点数格式,不属于 IEEE 754 半精度浮点数范畴,所以你用 Android 自带的 Half 类转换失败是正常的,二者编码逻辑完全不兼容。

根据你给出的对端编码逻辑,解码只需要做逆向操作即可:

  1. 将收到的两个字节按反向字节序拼接为有符号16位整数(int16_t)
  2. 将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 07:15:00