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

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

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

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

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

有什么原因吗?

【问题讨论】:

    标签: c++ qt


    【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多