問題に遭遇し、解決策を見つけることができません。
だから私がやりたいのは、qUncompress(QByteArray)を使用してqtでデータを解凍し、wwwからgzip形式で送信することです。私はwiresharkを使用して、これが有効なgzipストリームであり、zip / rarでもテストされており、どちらも解凍できることを確認しました。
これまでのコードは次のようになります。
static const char dat[40] = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xaa, 0x2e, 0x2e, 0x49, 0x2c, 0x29,
0x2d, 0xb6, 0x4a, 0x4b, 0xcc, 0x29, 0x4e, 0xad, 0x05, 0x00, 0x00, 0x00, 0xff, 0xff, 0x03, 0x00,
0x2a, 0x63, 0x18, 0xc5, 0x0e, 0x00, 0x00, 0x00
};
//this data contains string: {status:false}, in gzip format
QByteArray data;
data.append( dat, sizeof(dat) );
unsigned int size = 14; //expected uncompresed size, reconstruct it BigEndianes
//prepand expected uncompressed size, last 4 byte in dat 0x0e = 14
QByteArray dataPlusSize;
dataPlusSize.append( (unsigned int)((size >> 24) & 0xFF));
dataPlusSize.append( (unsigned int)((size >> 16) & 0xFF));
dataPlusSize.append( (unsigned int)((size >> 8) & 0xFF));
dataPlusSize.append( (unsigned int)((size >> 0) & 0xFF));
QByteArray uncomp = qUncompress( dataPlusSize );
qDebug() << uncomp;
また、解凍は次のように失敗します。qUncompress:Z_DATA_ERROR:入力データが破損しています。
AFAIK gzipは、10バイトのヘッダー、DEFLATE peyload、12バイトのトレーラー(8バイトのCRC32 + 4バイトのISIZE-圧縮されていないデータサイズ)で構成されます。ヘッダーとトレーラーをストライピングすると、DEFLATEデータストリームが残るはずです。qUncompressでも同じエラーが発生します。
次のように、PHPで圧縮されたデータ文字列を確認しました。
$stringData = gzcompress( "{status:false}", 1);
そしてqUncompressはそのデータを解凍します(つまり、ID1 = 0x1f、ID2 = 0x8bですが、gzipヘッダーは表示されませんでした)デバッグで上記のコードを確認したところ、次の場所でエラーが発生しました:
if (
#endif
((BITS(8) << 8) + (hold >> 8)) % 31) { //here is error, WHY? long unsigned int hold = 35615
strm->msg = (char *)"incorrect header check";
state->mode = BAD;
break;
}
inflate.c行610。
qUncompressは単にzlibのラッパーであることを知っているので、問題なくgzipを処理できるはずです。コメントは大歓迎です。
よろしくお願いします