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

总结

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

相关推荐
用户8055336980321 小时前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner1 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz6 天前
QML Hello World 入门示例
qt
xcyxiner9 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner10 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner10 天前
DicomViewer (添加模型类)3
qt
xcyxiner11 天前
DicomViewer (目录调整) 2
qt
xcyxiner11 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00613 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术13 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript