首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ByteOrder的QDataStream和QByteArray

使用ByteOrder的QDataStream和QByteArray
EN

Stack Overflow用户
提问于 2020-03-30 13:15:19
回答 2查看 56关注 0票数 0

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

代码语言:javascript
复制
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];

下面的代码输出如下:

代码语言:javascript
复制
10 0 20 0

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

代码语言:javascript
复制
0 10 0 20

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-30 13:27:40

writeRawData不是你想要的,它只是将数据原样追加到buffer中。字节顺序取决于类型,但是writeRawData接受参数作为char*,所以它不知道您想序列化的类型的任何信息。

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

代码语言:javascript
复制
#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( ' ' );
}
票数 1
EN

Stack Overflow用户

发布于 2020-03-30 13:27:16

当您使用

代码语言:javascript
复制
in.writeRawData((char*)data, 4);

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

代码语言:javascript
复制
in << data[0] << data[1]

而不是。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60924453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档