【问题标题】:How to Convert Big/Little-Endian bytes to Integer and vice versa in C++如何在 C++ 中将 Big/Little-Endian 字节转换为整数,反之亦然
【发布时间】:2021-02-25 05:34:08
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: c++ qt endianness


【解决方案1】:

方法是:

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


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

【讨论】:

    【解决方案2】:

    您可以使用 Qt 的 QtEndian 实用函数来完成此操作。

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

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

    ... 或者,将 char 数组的前四个字节作为 little-endian quint32(或 uint32_t)读取:

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

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

    【讨论】:

      猜你喜欢
      • 2011-02-09
      • 2014-03-05
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 2011-11-28
      相关资源
      最近更新 更多