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

总结

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

相关推荐
caimouse1 小时前
reactos编码规范
c语言·开发语言
xieliyu.5 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
CryptoPP6 小时前
快速对接东京证券交易所API数据:实战指南与代码示例
开发语言·人工智能·windows·python·信息可视化·区块链
ZC跨境爬虫6 小时前
跟着 MDN 学JavaScript day_7:数学运算与逻辑判断实战测试
开发语言·前端·javascript·学习·ecmascript
阳区欠7 小时前
【LangChain】LLM基础介绍
开发语言·python·langchain
Jinkxs7 小时前
Java 跨域14-Java 与区块链(Hyperledger)集成
java·开发语言·区块链
晨曦中的暮雨8 小时前
Golang速通(Javaer版)
java·开发语言·后端·golang
小小编程路9 小时前
Python 还有容器类型互转、进制转换、字符编码转换
开发语言·windows·python
qeen879 小时前
【C++】类与对象之类的默认成员函数(二)
android·c语言·开发语言·c++·笔记·学习
CRMEB系统商城9 小时前
CRMEB多商户系统(Java)v2.3公测版发布
java·开发语言·人工智能·小程序·开源·php