Tamanho da QByteArray é difícil de calcular?
-
26-12-2019 - |
Pergunta
Recentemente eu programado para fazer a transmissão do arquivo com o Qt.Pensei que trabalhou agora, eu ainda estou curioso sobre o que aconteceu.Por favor, ajude-me a descobrir o motivo.Muito obrigado.
Qual o tamanho da cabeça é maior que a soma de sizeof(qin32), sizeof(qint32) e o comprimento do nome do arquivo?(Eu acho que ele é a razão de função - 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);
Solução
Você tem feito isso de complicado.O padrão é assim:
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);
e leitura de código:
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;
}
}
Outras dicas
info.filename()
escreve seu próprio comprimento
se você não quer isso, então você pode fazer
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);
usando writeRawData
que ignora qualquer codificação
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow