【问题标题】:QDataStream and QByteArray wirh ByteOrderQDataStream 和 QByteArray wirh ByteOrder
【发布时间】:2020-07-10 11:05:18
【问题描述】:

我最近在想用 QDataStream 填充 QByteArray 类型时遇到一个问题。 QDataStream 可以设置字节顺序。

uint16_t data[2] = {10, 20};
QByteArray array;
QDataStream in(&array, QIODevice::ReadWrite);
in.setVersion(QDataStream::Qt_5_7);
in.setByteOrder(QDataStream::BigEndian);
in.writeRawData((char*)data, 4);
qDebug()<<(int)array[0]<<(int)array[1]<<(int)array[2]<<(int)array[3];

这段代码在下面输出:

10 0 20 0

如果我将 ByteOrder 从 BigEndian 更改为 LittleEndian,则输出相同。为什么我更改 ByteOrder 并收到相同的结果?我认为输出应该如下所示:

0 10 0 20

如果我想得到相反的结果,我应该怎么做?

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    writeRawData 不是您要查找的内容,它只是按原样将数据附加到缓冲区。字节序取决于类型,但writeRawData 将参数作为char*,因此它对您要序列化的类型一无所知。

    下面的可能实现。 以十六进制表示形式打印缓冲区。

    #include <QDebug>
    #include <QDataStream>
    #include <QByteArray>
    
    int main()
    {
        QByteArray buffer;
        QDataStream ss { &buffer , QIODevice::ReadWrite };
    
        uint16_t data[2] = {10, 20};
        QByteArray array_be;
        QDataStream in_be(&array_be, QIODevice::ReadWrite);
        in_be.setVersion(QDataStream::Qt_5_7);
        in_be.setByteOrder(QDataStream::BigEndian);
    
        in_be << data[ 0 ] << data [ 1 ];
    
        qDebug() << "BE :" << array_be.toHex( ' ' );
    
        QByteArray array_le;
        QDataStream in_le(&array_le, QIODevice::ReadWrite);
        in_le.setVersion(QDataStream::Qt_5_7);
        in_le.setByteOrder(QDataStream::LittleEndian);
    
        in_le << data[ 0 ] << data [ 1 ];
    
        qDebug() << "LE :" << array_le.toHex( ' ' );
    }
    

    【讨论】:

    • 非常感谢!现在我知道为什么 writeRawData 不起作用了。
    【解决方案2】:

    当你使用

    in.writeRawData((char*)data, 4);
    

    您正在编写 4 个char 对象。无论您使用哪种字节序,该操作的结果都不会改变。使用

    in << data[0] << data[1]
    

    改为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-09
      • 2023-03-08
      • 2019-05-26
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 1970-01-01
      相关资源
      最近更新 更多