将数值按照指定缩放比例转换成整数,写入QByteArray

/* @函数名称     : addDataValue
 * @函数描述     : 将数值按照指定缩放比例转换成整数,写入QByteArray,
 *                 支持 1、2、4 字节写入(大端序,高字节在前)
 * @参数说明     :
 *    data (QByteArray&) - 目标字节数组,写入数据
 *    value (T)          - 传入的数值,支持整数和浮点数类型
 *    scale (double)     - 缩放比例,例如scale=100表示放大100倍
 *    byteCount (int)    - 写入字节数,支持 1、2、4,默认 2 字节
 * @调用示例     :
 *      QByteArray data;
 *      double val = 12.34;
 *      addDataValue(data, val, 100.0);       // 写2字节分辨率0.01
 *      addDataValue(data, val, 10.0, 1);     // 写1字节分辨率0.1
 *      addDataValue(data, val, 1000.0, 4);   // 写4字节分辨率0.001
 */
template<typename T> void addDataValue(QByteArray &data, T value, double scale, int byteCount = 2)
{
    static_assert(std::is_arithmetic<T>::value, "仅支持数值类型");

    // 缩放后转换为无符号整数
    uint64_t scaledValue = static_cast<uint64_t>(value * scale);

    if (byteCount == 1)
    {
        data.append(static_cast<char>(scaledValue & 0xFF));
    }
    else if (byteCount == 2)
    {
        data.append(static_cast<char>((scaledValue >> 8) & 0xFF));
        data.append(static_cast<char>(scaledValue & 0xFF));
    }
    else if (byteCount == 4)
    {
        data.append(static_cast<char>((scaledValue >> 24) & 0xFF));
        data.append(static_cast<char>((scaledValue >> 16) & 0xFF));
        data.append(static_cast<char>((scaledValue >> 8) & 0xFF));
        data.append(static_cast<char>(scaledValue & 0xFF));
    }
    else
    {
        qWarning() << "addDataValue不支持" << byteCount << "字节写入";
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值