2016-05-15 85 views
0

我有这样的代码:Qt的QDataStream:运营商>>为quint16 - 我没有得到它在所有

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

而作为完全出乎意料其打印

PORTNO:13361

我看的Qt的代码(4X + 5×):

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

现在我明白为什么它给了我这样的结果,但我不明白为什么QDataStream有这样奇怪的实现?

回答

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)。