我有这样的代码:
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有这么奇怪的实现?
答案 0 :(得分:3)
QDataStream
不用于将数据从一种类型转换为另一种类型以显示文本。 From the docs:
您还可以使用数据流来读取/写入原始未编码的二进制数据。如果需要“解析”输入流,请参阅QTextStream。
QDataStream类实现C ++基本数据类型的序列化,如char,short,int,char *等。通过将数据分解为基本单元来完成更复杂数据的序列化。
数据流与QIODevice紧密合作。 QIODevice表示可以从中读取数据和向其写入数据的输入/输出介质。 QFile类是I / O设备的一个示例。
您正在使用cout
打印已编码的二进制数据,该数据被解释为整数。该数据用于读取和写入IO设备,而不是打印。
关于reinterpret_cast
到qint16
:因为QDataStream
只是写原始二进制数据,假装一个unsigned int签名对输出没有影响到数据流。这只是一种重用代码的廉价方法:无论类型如何,这些位最终都被写为位。当您从数据流中读回时,由您决定将它们转换回适当的数据类型(quint16
)。