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

1. 基本转换函数(针对 16/32/64 位整数)
-
qToBigEndian:将主机字节序的整数转换为大端字节序(网络字节序)。
重载版本支持quint16、quint32、quint64类型,例如:quint16 host16 = 0x1234; quint16 net16 = qToBigEndian(host16); // 转换为大端(网络字节序),等效于 htonsquint32 host32 = 0x12345678; quint32 net32 = qToBigEndian(host32); // 等效于 htonl -
qFromBigEndian:将大端字节序(网络字节序)的整数转换为主机字节序。
重载版本支持quint16、quint32、quint64类型,例如:quint16 net16 = 0x1234; quint16 host16 = qFromBigEndian(net16); // 转换为主机字节序,等效于 ntohsquint32 net32 = 0x12345678; quint32 host32 = qFromBigEndian(net32); // 等效于 ntohl
2. 针对缓冲区的转换(直接操作字节数组)
如果需要将数据直接写入缓冲区(如 QByteArray 或原始字节指针),可以使用以下函数:
-
qToBigEndian(T value, uchar *buffer):将整数value以大端字节序写入buffer。
示例:quint32 val = 0x12345678; uchar buf[4]; qToBigEndian(val, buf); // buf 中存储 [0x12, 0x34, 0x56, 0x78](大端) -
qFromBigEndian(const uchar *buffer):从缓冲区buffer中读取大端字节序的数据,转换为主机字节序。
示例: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。
