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

How to Convert Big/Little-Endian bytes to Integer and vice versa in C++

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

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

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

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

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

方法是:

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


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

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

例如,如果您有一个 quint32(或 uint32_t)并希望将该值以小端格式写入 char 数组的前四个字节:

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

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

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

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