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

总结

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

相关推荐
C^h5 小时前
c++ string
开发语言·c++
raindayinrain6 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的6 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao6 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
学逆向的7 小时前
C 局部静态变量
c语言·开发语言·网络安全
小徐不徐说7 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
大都督会赢的7 小时前
C++第一节课
开发语言·c++
“AI国潮设计-小江”7 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
小王C语言8 小时前
Qt常用控件:容器类控件,标题分组框、标签页(浏览器标签)
开发语言·qt
TMedical8 小时前
MedPlanning 截骨模拟矫形功能
c++·图像处理·人工智能·qt·健康医疗