最近,当我想用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如果我想得到相反的结果,我应该怎么做?
发布于 2020-03-30 13:27:40
writeRawData不是你想要的,它只是将数据原样追加到buffer中。字节顺序取决于类型,但是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( ' ' );
}发布于 2020-03-30 13:27:16
当您使用
in.writeRawData((char*)data, 4);您正在编写4个char对象。无论您使用哪种字节顺序,该操作的结果都不会改变。使用
in << data[0] << data[1]而不是。
https://stackoverflow.com/questions/60924453
复制相似问题