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