0

私の問題は、変数の内容が常に空であることです。これが私のコードです:

QFile file("/home/qt/Client/file.txt");
if(file.open(QIODevice::ReadOnly)){
    qDebug("File opened");
}

QDataStream fileData(&file);

QByteArray content;
QDataStream out(&content, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_7);  

out << static_cast<quint16>(0) << "file" << "/home/qt/Client/file.txt" << fileData;

out.device()->seek(0);
out << static_cast<quint16>(content.size());

qDebug() << content.constData();

tcpSocket->write(content);

出力:

File opened

コンテンツは常に空です

ご協力いただきありがとうございます

4

1 に答える 1

4

contentは空ではありませんが、Cスタイルの0で終了する文字列として解釈すると、空のように見えます。

あなたが書くとき:

out.device()->seek(0);
out << static_cast<quint16>(content.size());

これにより、の最初の2バイトがビッグエンディアン形式に設定されcontentますcontent.size()(これがデフォルトです)。したがって、content.size()が255未満の場合、の最初のバイトはcontent.constData()0('\0')になります。constData()「文字列」は「文字列の終わり」マーカーで始まるため、Cスタイルの文字列を期待する関数で印刷しようとしても何も出力されません。

の全内容を表示したい場合はcontent、すべての文字を個別に出力し、のようなものを使用hexdumpして生データを表示する必要があります。

代わりにこれを行うと、次のようになりますqDebug() << content.constData();

for (int i=0; i<content.size(); i++) {
    std::cout << content.constData()[i];
}

実行時の出力(ファイルには20'a'文字しか含まれていません):

 $ ./qt | hexdump -C
00000000  00 40 00 00 00 05 66 69  6c 65 00 00 00 00 19 2f  |.@....file...../|
00000010  68 6f 6d 65 2f 71 74 2f  43 6c 69 65 6e 74 2f 66  |home/qt/Client/f|
00000020  69 6c 65 2e 74 78 74 00  00 00 00 14 61 61 61 61  |ile.txt.....aaaa|
00000030  61 61 61 61 61 61 61 61  61 61 61 61 61 61 61 61  |aaaaaaaaaaaaaaaa|
00000040

私が使用した場合:

std::cout << content.constData();

その最初の0文字のため、出力はありませんでした。

データが長く、サイズが255より大きい場合content、最初の文字は0ではなくなりますが、Qtは最初にQString(および他のほとんどのタイプ)を書き込むことによってQString(および他のほとんどのタイプ)をシリアル化するため、2文字のガベージだけを出力します。長さ(ここでは32ビット)、次にその内容。ビッグエンディアン表記であるため、最初のバイトは0になる可能性が非常に高くなります。

注釈付き出力:

00000000  00 40 00 00 00 05 66 69  6c 65 00 00 00 00 19 2f  |.@....file...../|
          <u16> < str len > <  str data   > < str len > <
00000010  68 6f 6d 65 2f 71 74 2f  43 6c 69 65 6e 74 2f 66  |home/qt/Client/f|
                               str data...
00000020  69 6c 65 2e 74 78 74 00  00 00 00 14 61 61 61 61  |ile.txt.....aaaa|
            str data            >  <data len > < 
00000030  61 61 61 61 61 61 61 61  61 61 61 61 61 61 61 61  |aaaaaaaaaaaaaaaa|
                    data                                 >
于 2011-10-05T07:36:57.187 に答える