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

总结

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

相关推荐
一直不明飞行1 小时前
Java的equals(),hashCode()应该在什么时候重写
java·开发语言·jvm
盲敲代码的阿豪2 小时前
Python 入门基础教程(爬虫前置版)
开发语言·爬虫·python
basketball6162 小时前
C++ 构造函数完全指南:从入门到进阶
java·开发语言·c++
互联科技报2 小时前
2026超融合选型:Top5品牌与市场格局解读
开发语言·perl
weixin199701080162 小时前
[特殊字符] 智能数据采集:数字化转型的“数据石油勘探队”(附Python实战源码)
开发语言·python
想唱rap3 小时前
IO多路转接之poll
服务器·开发语言·数据库·c++
@杰克成3 小时前
Java学习30
java·开发语言·学习
三品吉他手会点灯3 小时前
C语言学习笔记 - 40.数据类型 - scanf函数的编程规范与非法输入处理
c语言·开发语言·笔记·学习
凯瑟琳.奥古斯特3 小时前
数据冗余与规范化的本质[数据库原理]
开发语言·数据库·职场和发展
码农老李4 小时前
openEuler2403服务器版 原生官方镜像和飞腾定制镜像
开发语言·php