qt-字符串版本与数值版本互转

目录标题

提问

QString WindLidarConfig::version = "v1.0.0";怎么做到版本和behead.append(0x01); behead.append(0x00);互转(效果是1.0)?

分析

在C++中实现版本字符串(如"v1.0.0")与二进制数据(如0x01, 0x00)的双向转换,需通过解析版本号结构和字节序列化/反序列化逻辑完成。

  • 版本字符串转二进制数据
    目标:将QString version = "v1.0.0"; 转换为 QByteArray,如主版本1→0x01,次版本0→0x00,修订号0→0x00。
    实现逻辑:
cpp 复制代码
#include <QString>
#include <QByteArray>
#include <QStringList>

QByteArray versionToBytes(const QString& versionStr) {
    // 去除前缀"v"并分割版本号
    QStringList parts = versionStr.mid(1).split('.'); // "v1.0.0" → "1.0.0" → ["1", "0", "0"]
    if (parts.size() < 2) return QByteArray(); // 至少需要主版本和次版本

    QByteArray bytes;
    bool ok;
    // 转换主版本(第0部分)
    int major = parts[0].toInt(&ok);
    if (!ok) return QByteArray();
    bytes.append(static_cast<char>(major)); // 转为单字节

    // 转换次版本(第1部分)
    int minor = parts[1].toInt(&ok);
    if (!ok) return QByteArray();
    bytes.append(static_cast<char>(minor));

    // 可选:处理修订号(第2部分)
    if (parts.size() > 2) {
        int patch = parts[2].toInt(&ok);
        if (ok) bytes.append(static_cast<char>(patch));
    }
    return bytes;
}

// 使用示例
QString version = "v1.0.0";
QByteArray behead = versionToBytes(version); // 结果:0x01, 0x00, 0x00
  • 二进制数据转版本字符串
    目标:将QByteArray behead = {0x01, 0x00, 0x00}; 转换为字符串"v1.0.0"。
    实现逻辑:
cpp 复制代码
QString bytesToVersion(const QByteArray& bytes) {
    if (bytes.isEmpty()) return QString();

    // 提取主版本、次版本、修订号(按字节转整数)
    int major = static_cast<unsigned char>(bytes[0]); // 避免符号扩展问题
    int minor = (bytes.size() > 1) ? static_cast<unsigned char>(bytes[1]) : 0;
    int patch = (bytes.size() > 2) ? static_cast<unsigned char>(bytes[2]) : 0;

    // 格式化为版本字符串
    return QString("v%1.%2.%3").arg(major).arg(minor).arg(patch);
}

// 使用示例
QByteArray behead = {0x01, 0x00, 0x00};
QString version = bytesToVersion(behead); // 结果:"v1.0.0"
  • 关键注意事项
    • 字节范围处理:版本号数字需在0-255范围内(单字节可表示),否则会溢出。
    • 版本号前缀:字符串需以v开头(如v1.0.0),解析时通过mid(1)跳过。
    • 灵活性扩展:
    • 若只需主次版本(如1.0),可调整versionToBytes仅取前两个部分,bytesToVersion忽略修订号。
    • 支持修订号可选(如v1.0 → 0x01, 0x00),通过parts.size()判断是否存在。
  • 双向转换验证
cpp 复制代码
// 测试双向转换
QString original = "v1.0.0";
QByteArray data = versionToBytes(original); // 0x01, 0x00, 0x00
QString restored = bytesToVersion(data);    // "v1.0.0"

// 验证
qDebug() << "Original:" << original;
qDebug() << "Data:" << data.toHex();       // 输出十六进制:010000
qDebug() << "Restored:" << restored;       // 输出:v1.0.0

总结

通过解析版本字符串结构(去除前缀、分割数字)和字节序列化逻辑(数字转单字节),可实现版本与二进制数据的双向转换。核心在于确保版本号数字在单字节范围内,并正确处理字符串与字节数组的转换细节。

相关推荐
blasit1 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
郑州光合科技余经理6 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1236 天前
matlab画图工具
开发语言·matlab
dustcell.6 天前
haproxy七层代理
java·开发语言·前端
norlan_jame6 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone6 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ4022054966 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
遥遥江上月6 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js
m0_531237176 天前
C语言-数组练习进阶
c语言·开发语言·算法
Railshiqian6 天前
给android源码下的模拟器添加两个后排屏的修改
android·开发语言·javascript