我正在编写一个程序,将文件从QT客户端发送到Android客户端。
特定的代码行通过以下代码将长度为前缀的文件名字符串写入它们之间维护的流:
qDebug() << socket.write(QByteArray::number((qint32)fileName.length()));
我已将fileName.length()
转换为qint32
,但由于某种原因,上述代码仅向套接字的流写入2个字节(即控制台窗口显示2
qDebug()
)。
有什么理由吗?
答案 0 :(得分:2)
qint32
的投射无关紧要,没有用处。
QByteArray::number
创建数字的 ASCII文本表示。在这种情况下,fileName.length()
必须具有两个数字,并且介于10和99之间。因此,字节数组的内容是两个ASCII数字。请注意,零终结符不包含在数组的length()
或size()
中,因此不会被套接字传输。
您传输的内容是 text ,特别是"21"
的字符串,fileName.length()
为21。
执行您打算执行的操作的代码是:
QDataStream str(&socket);
str << (qint32)fileName.length();
默认字节顺序为big-endian(网络字节顺序)。您可以选择其他字节顺序:
str.setByteOrder(QDataStream::LittleEndian);
str << ...;