QByteArray::number(int) 只有两个字节长

Posted

技术标签:

【中文标题】QByteArray::number(int) 只有两个字节长【英文标题】:QByteArray::number(int) is only two bytes long 【发布时间】:2014-09-19 17:50:44 【问题描述】:

我正在编写一个程序,将文件从 QT 客户端发送到 android 客户端。

特定的代码行通过以下代码将带长度前缀的文件名字符串写入它们之间维护的流:

qDebug() << socket.write(QByteArray::number((qint32)fileName.length()));

我已将fileName.length() 转换为qint32,但由于某种原因,上面的代码仅将 2 个字节写入套接字的流(即控制台窗口显示来自qDebug()2)。

有什么原因吗?

【问题讨论】:

【参考方案1】:

转换为qint32 是无关紧要的,没有任何作用。

QByteArray::number 创建数字的ASCII 文本 表示。在这种情况下,fileName.length() 必须有 两个 数字,并且介于 10 和 99 之间。因此,字节数组的内容是两个 ASCII 数字。请注意,零终止符不包含在数组的length()size() 中,因此不会由套接字传输。

您传输的是文本,特别是一个字符串"21",如果fileName.length() 是21。

执行您打算执行的代码是:

QDataStream str(&socket);
str << (qint32)fileName.length();

默认字节顺序为大端(网络字节顺序)。您可以选择其他字节顺序:

str.setByteOrder(QDataStream::LittleEndian);
str << ...;

【讨论】:

关于QDataStream 的注释:它不处理部分写入和读取。因此,除非您有 100% 可靠的网络连接(本地主机或 unix 域套接字可能足够接近),否则不应直接在网络套接字上使用它。相反,在QByteArray 上使用QDataStream,然后发送/接收它。 @hyde 想必在你完成后检查事情是否成功很容易吧?它不会“处理”部分写入/读取,但也不会崩溃。 是的,我的意思是,不可能将部分数据返回到流中并在更多数据到达后重试。状态 QDataStream::ReadCorruptData 是不可恢复的,AFAIK。

以上是关于QByteArray::number(int) 只有两个字节长的主要内容,如果未能解决你的问题,请参考以下文章

只允许 Ints 进入 QPlainTextEdit

35.按要求编写Java程序: 编写一个接口:InterfaceA,只含有一个方法int method(int n); 编写一个类:ClassA来实现接口InterfaceA,实现int

按要求编写Java程序: 编写一个接口:InterfaceA,只含有一个方法int method(int n); 编写一个类:ClassA来实现接口InterfaceA,实现int met

[剑指offer] 40. 数组中只出现一次的数字

为啥 int answer = generator.nextInt(10) + 1;只产生 1 到 10 之间的数字?

剑指OFFER 数组中只出现一次的数字