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 >