Qt QDataStream:operator>>对于quint16 - 我根本没有得到它

时间:2016-05-15 11:55:05

标签: c++ qt

我有这样的代码:

    QByteArray portnoStr = "41034";
    quint16 portno;
    QDataStream stream(&portnoStr, QIODevice::ReadOnly);
    stream >> portno;
    std::cout << "portno: " << portno << "\n";

完全出乎意料的是打印

  

portno:13361

我看一下Qt(4x + 5x)的代码:

inline QDataStream &QDataStream::operator>>(quint16 &i)
{ return *this >> reinterpret_cast<qint16&>(i); }

现在我理解为什么它会给我这样的结果,

但是我不明白为什么QDataStream有这么奇怪的实现?

1 个答案:

答案 0 :(得分:3)

QDataStream不用于将数据从一种类型转换为另一种类型以显示文本。 From the docs

  

您还可以使用数据流来读取/写入原始未编码的二进制数据。如果需要“解析”输入流,请参阅QTextStream。

     

QDataStream类实现C ++基本数据类型的序列化,如char,short,int,char *等。通过将数据分解为基本单元来完成更复杂数据的序列化。

     

数据流与QIODevice紧密合作。 QIODevice表示可以从中读取数据和向其写入数据的输入/输出介质。 QFile类是I / O设备的一个示例。

您正在使用cout打印已编码的二进制数据,该数据被解释为整数。该数据用于读取和写入IO设备,而不是打印。

关于reinterpret_castqint16 :因为QDataStream只是写原始二进制数据,假装一个unsigned int签名对输出没有影响到数据流。这只是一种重用代码的廉价方法:无论类型如何,这些位最终都被写为位。当您从数据流中读回时,由您决定将它们转换回适当的数据类型(quint16)。