Qt 的字节序转换

在 Qt 中,提供了一系列用于字节序转换的函数,类似于 C 标准库中的 htons、htonl、ntohs、ntohl 等,主要用于主机字节序(Host Byte Order)与网络字节序(Network Byte Order,大端字节序)之间的转换。这些函数定义在 <QtEndian> 头文件中,具体如下:

1. 基本转换函数(针对 16/32/64 位整数)

  • qToBigEndian :将主机字节序的整数转换为大端字节序(网络字节序)。

    重载版本支持 quint16、quint32、quint64 类型,例如:

    cpp 复制代码
    quint16 host16 = 0x1234;
    quint16 net16 = qToBigEndian(host16); // 转换为大端(网络字节序),等效于 htons
    
    quint32 host32 = 0x12345678;
    quint32 net32 = qToBigEndian(host32); // 等效于 htonl
  • qFromBigEndian :将大端字节序(网络字节序)的整数转换为主机字节序。

    重载版本支持 quint16、quint32、quint64 类型,例如:

    cpp 复制代码
    quint16 net16 = 0x1234;
    quint16 host16 = qFromBigEndian(net16); // 转换为主机字节序,等效于 ntohs
    
    quint32 net32 = 0x12345678;
    quint32 host32 = qFromBigEndian(net32); // 等效于 ntohl

2. 针对缓冲区的转换(直接操作字节数组)

如果需要将数据直接写入缓冲区(如 QByteArray 或原始字节指针),可以使用以下函数:

  • qToBigEndian(T value, uchar *buffer) :将整数 value 以大端字节序写入 buffer。

    示例:

    cpp 复制代码
    quint32 val = 0x12345678;
    uchar buf[4];
    qToBigEndian(val, buf); // buf 中存储 [0x12, 0x34, 0x56, 0x78](大端)
  • qFromBigEndian(const uchar *buffer) :从缓冲区 buffer 中读取大端字节序的数据,转换为主机字节序。

    示例:

    cpp 复制代码
    uchar buf[4] = {0x12, 0x34, 0x56, 0x78};
    quint32 val = qFromBigEndian(buf); // val = 0x12345678(主机字节序)

3. 小端字节序转换(扩展功能)

Qt 还提供了小端字节序的转换函数(适用于特定场景,如文件格式解析):

  • qToLittleEndian:主机字节序 → 小端字节序。
  • qFromLittleEndian:小端字节序 → 主机字节序。
    使用方式与大端函数类似。

注意事项

  • 网络协议(如 TCP/IP)通常使用大端字节序,因此 qToBigEndian 和 qFromBigEndian 是网络编程中最常用的转换函数,分别对应 htons/htonl 和 ntohs/ntohl。
  • 使用前需包含头文件 <QtEndian>。
  • 这些函数是跨平台的,会根据当前主机的字节序(大端或小端)自动处理转换逻辑,无需手动判断主机类型。

总结:Qt 中与 htons/htonl 等效的核心函数是 qToBigEndian,与 ntohs/ntohl 等效的是 qFromBigEndian。

相关推荐
半杯咖啡半行码18 分钟前
Qt开发实战:数据库、MV 模式、QProcess与串口通信全攻略
数据库·qt
SEO_juper24 分钟前
用 Python 写一个 GEO 可见性检查脚本:你的网站现在能被 AI 引用吗
开发语言·人工智能·爬虫·python·seo·外贸独立站
西柚小萌新40 分钟前
【LLM&&AI应用开发 八股文】--4.3.Agent智能体(下)
java·开发语言·数据库
北极有牛42 分钟前
cpp学习笔记--常量指针
java·开发语言·算法
半杯咖啡半行码1 小时前
C++ 编程与 STL 模板:从泛型编程到内存安全详解
开发语言·c++
caoerzhong1 小时前
JeeWMS 开源 WMS 部署避坑指南:Java 仓库管理系统的环境基线、四类根因与可复现交付
java·开发语言·开源
时间的拾荒人1 小时前
Qt 界面优化:绘图详解 —— 从基础图形到图片处理
开发语言·qt·面试
MayZork2 小时前
Qt 文件操作:QSaveFile 与 QTemporaryFile(含 QTemporaryDir)实战
开发语言·qt
北冥you鱼2 小时前
Go 语言空接口(interface{})使用场景与最佳实践
开发语言·windows·golang
xh didida2 小时前
Linux -- 基础IO
linux·服务器·开发语言·c++