qt-uint64_t转QByteArray小端字节序并指定长度-小端系统

简介

在C++中,将uint64_t转换为小端字节序的QByteArray并指定长度,需通过手动字节分解+填充/截断实现。

核心代码实现

cpp 复制代码
#include <QCoreApplication>
#include <QByteArray>
#include <QDebug>
#include <cstdint>

QByteArray uint64ToQByteArrayLittleEndian(uint64_t value, int targetLength, 
                                            char padChar = '\0', Qt::Alignment padAlign = Qt::AlignRight) {
    QByteArray bytes;
    bytes.resize(8); // 初始化为8字节(uint64_t的原始长度)

    // 手动按小端序分解uint64_t为字节
    bytes[0] = static_cast<char>(value & 0xFF);         // 最低有效字节(LSB)
    bytes[1] = static_cast<char>((value >> 8) & 0xFF);
    bytes[2] = static_cast<char>((value >> 16) & 0xFF);
    bytes[3] = static_cast<char>((value >> 24) & 0xFF);
    bytes[4] = static_cast<char>((value >> 32) & 0xFF);
    bytes[5] = static_cast<char>((value >> 40) & 0xFF);
    bytes[6] = static_cast<char>((value >> 48) & 0xFF);
    bytes[7] = static_cast<char>((value >> 56) & 0xFF); // 最高有效字节(MSB)

    const int currentLength = bytes.length();

    // 处理长度不足的情况
    if (currentLength < targetLength) {
        const int paddingNeeded = targetLength - currentLength;
        QByteArray padding(paddingNeeded, padChar);
        if (padAlign == Qt::AlignRight) {
            bytes.append(padding); // 末尾填充
        } else if (padAlign == Qt::AlignLeft) {
            bytes.prepend(padding); // 开头填充
        } else {
            qWarning() << "Invalid alignment, defaulting to AlignRight";
            bytes.append(padding);
        }
    } 
    // 处理长度超过的情况
    else if (currentLength > targetLength) {
        qWarning() << "Truncating result to target length";
        bytes = bytes.left(targetLength);
    }

    return bytes;
}

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    uint64_t testValue = 0x123456789ABCDEF0;
    
    // 测试1: 目标长度10,末尾补零
    QByteArray result1 = uint64ToQByteArrayLittleEndian(testValue, 10);
    qDebug() << "Result 1 (end padding):" << result1.toHex();
    
    // 测试2: 目标长度10,开头补零
    QByteArray result2 = uint64ToQByteArrayLittleEndian(testValue, 10, '\0', Qt::AlignLeft);
    qDebug() << "Result 2 (start padding):" << result2.toHex();
    
    // 测试3: 目标长度6,截断处理
    QByteArray result3 = uint64ToQByteArrayLittleEndian(testValue, 6);
    qDebug() << "Result 3 (truncated):" << result3.toHex();

    return a.exec();
}

关键逻辑解析

  • 小端序分解:
    uint64_t的最低有效字节(LSB)存储在bytes[0],最高有效字节(MSB)存储在bytes[7]。
    通过位操作(如value & 0xFF和移位)逐字节提取,确保小端序。
  • 长度处理:
    填充:若目标长度大于8字节,在开头或末尾填充指定字符(如\0)。
    截断:若目标长度小于8字节,保留前targetLength字节(可能破坏数据,需谨慎)。
    系统字节序无关性:
    代码手动控制字节顺序,与系统实际字节序无关。即使系统是大端,也能生成小端序的QByteArray。

测试用例输出

  • 测试1(末尾补零):
    原始数据:F0 DE BC 9A 78 56 34 12(小端序)
    目标长度10 → 末尾补2个零:F0 DE BC 9A 78 56 34 12 00 00
  • 测试2(开头补零):
    目标长度10 → 开头补2个零:00 00 F0 DE BC 9A 78 56 34 12
  • 测试3(截断):
    目标长度6 → 保留前6字节:F0 DE BC 9A 78 56

注意

截断风险:截断可能导致数据丢失或解析错误,需确保目标长度合理。

填充字符:根据协议或场景选择填充字符(如零、空格或自定义值)。

跨平台兼容性:手动字节分解确保代码在任何系统字节序下行为一致。

通过此实现,可灵活控制uint64_t到QByteArray的小端序转换及长度调整,满足网络传输、文件存储等场景需求。

相关推荐
小短腿的代码世界9 小时前
Qt日志系统深度解析:从qDebug到企业级日志框架
开发语言·qt
Morwit13 小时前
QML组件之间的通信方案(暴露子组件)
c++·qt·职场和发展
金色熊族18 小时前
解析QTransform的用法
qt
追烽少年x20 小时前
Qt多线程编程:QThread与QtConcurrent的对比与应用
qt
小短腿的代码世界1 天前
Qt实时盈亏计算深度解析:从持仓数据到动态盈亏展示
开发语言·qt
Python私教2 天前
GenericAgent PySide6 桌面应用深度解析:悬浮按钮 + 聊天面板的原生 Qt 方案
开发语言·数据库·qt
用户805533698032 天前
现代Qt开发教程(新手篇)1.11——定时器
c++·qt
小短腿的代码世界2 天前
Qt券商接口封装深度解析:统一API设计与多源适配
开发语言·qt·单元测试
T0uken2 天前
基于 vcpkg 与 LLVM-MinGW 的 Qt6 静态链接开发方案
c++·windows·qt
Ulyanov2 天前
《现代 Python 桌面应用架构实战:PySide6 + QML 从入门到工程化》 开发环境搭建与工具链极简主义 —— 拒绝臃肿,构建工业级基座
开发语言·python·qt·ui·架构·系统仿真