문제

최근에 나는 큐티와 파일 전송을 할 프로그램.그것이 지금 효과가 있다고 생각했는데,나는 아직도 무슨 일이 일어 났는지 궁금합니다.이유를 찾도록 도와주세요.많은 감사.

왜 헤드의 크기가 파일 이름의 크기,크기 및 길이의 합보다 큽니까?(나는 그것이 함수 세트 버전의 이유라고 생각한다())

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);
도움이 되었습니까?

해결책

복잡하게 만들었습니다.패턴은 다음과 같습니다 :

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;
    }
}
.

다른 팁

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 내장 된 인코딩을 우회하는

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top