如何在 C++ 中将 Big/Little-Endian 字节转换为整数,反之亦然

问题描述

我将使用 QTcpsocket 以这种格式从服务器接收长度分隔的帧:-

+----------+--------------------------------+
| len: u32 |          frame payload         |
+----------+--------------------------------+

其中 u32 是以 Big-Endian 格式编码的 32 位无符号整数。根据配置,它也可以是 Little Endian 但我会在客户端事先了解字节序。

如何将这个 char* 数组或 QByteArray 的前 4 个字节转换为 32 位无符号整数?

阅读框架后,我需要以相同的格式发送消息。因此,如果我有长度为 20 字节的消息,我如何将 20 作为 32 位无符号整数以大/小端格式写入 QByteArray 或 char* ?

解决方法

您可以使用 Qt 的 QtEndian 实用函数来实现这一点。

例如,如果您有一个 quint32(或 uint32_t)并且想要将该值以 little-endian 格式写入字符数组的前四个字节:

const quint32 myValue = 12345;
char frameBuffer[256];
qToLittleEndian(myValue,frameBuffer);

... 或者,以小端quint32(或uint32_t)的形式读取字符数组的前四个字节:

const char frameBuffer[256] = {0x01,0x00,0x00};
quint32 myValue = qFromLittleEndian<quint32>(frameBuffer);

Big-endian 读/写工作相同,只是将子字符串 Little 替换为函数名称中的 Big

,

方法是:

bytearray -> stream ->setorder -> serialize to variable


QByteArray newData = ....;
QDataStream stream(newData);
stream.setByteOrder(QDataStream::LittleEndian); // or BigEndian
stream >> variable;