如何在 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
。
我将使用 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
。