1

最近我编写了用 Qt 进行文件传输的程序。认为它现在有效,我仍然对发生了什么感到好奇。请帮我找出原因。非常感谢。

为什么 head 的大小大于 sizeof(qin32)、sizeof(qint32) 和文件名长度的总和?(我猜是函数的原因 - setVersion())

QFileInfo info(file_to_send.fileName());
QByteArray head;
QDataStream out(&head, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_5_0);
out << qint32(file_to_send.size() + info.fileName().length() + sizeof(qint32)*2)
    << qint32(info.fileName().length())
    << info.fileName();
tcpClient.write(head);
4

2 回答 2

1

你让它变得复杂了。模式是这样的:

QFileInfo info(file_to_send.fileName());
QByteArray head;
QDataStream out(&head, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_5_0);
out << qint32(0)
    << info.fileName(); // << YouCanAddMoreStuffHere;

out.device()->seek(0);
out << qint32(out.length());

tcpClient.write(head);

并阅读代码:

void SomeClass::slotReadClient() { // slot connected to readyRead signal of QTcpSocket
    QTcpSocket *tcpSocket = (QTcpSocket*)sender();
    QDataStream clientReadStream(tcpSocket);

    while(true) {
        if (!next_block_size) {
            if (tcpSocket->bytesAvailable() < sizeof(qint32)) { // are size data available
                break;
            }
            clientReadStream >> next_block_size;
        }

        if (tcpSocket->bytesAvailable() < next_block_size) {
            break;
        }
        QString fileName;
        clientReadStream >> fileName; // >> YouCanAddMoreStuffHere; // same as above

        next_block_size = 0;
    }
}
于 2013-11-18T15:16:44.033 回答
0

info.filename() 写出自己的长度

如果你不想那样,那么你可以做

QFileInfo info(file_to_send.fileName());
QByteArray head;
QDataStream out(&head, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_5_0);
QByteArray filename = info.fileName().toLatin1();
out << qint32(file_to_send.size() + filename .length() + sizeof(qint32)*2);
    << qint32(filename .length())
out.writeRawData(fileName.constData(), filename.length());
tcpClient.write(head);

使用writeRawData它绕过任何内置编码

于 2013-11-18T12:23:10.080 回答