私はWarcraftのトラフィックの世界とのpcapファイルを持っていると私はそれを解凍する必要があります。だから私は、いくつかの出力が利用可能かどうか、データとチェックを解凍しようとした生データを反復処理するコードの一部を書いた圧縮ブロックの先頭を見つけるために http://wiki.xentax.com/index.php/List_Of_Compressed_Games :私はZlibのことで圧縮されていることを知っています。すごい解凍するデータはどのように
私はwindowBitsとZLIBを初期化するためにinflateInit2関数を呼び出す15(ZLIB形式)と30(GZIPフォーマット)パラメータ。私はZ_SYNC_FLUSHとZ_FULL_FLUSHパラメータでinflate()を試みました。 しかしそれは私に出力を与えません。
各パケットは00 00 00 FF FFので終わります。しかし、zlibのマニュアルによると、00時以降でなければなりません。
だから、すごいストリームからデータを抽出する方法は何ですか?
私のコードは次のとおりです。
void tryZlib(unsigned __int8 *StPt, __int64 size, Deflate *zlib)
{
z_stream_s * stream = new z_stream_s;
SecureZeroMemory(stream, sizeof(z_stream_s));
bool isInit = false;
while (size > 0)
{
BYTE *out_buf;
bool isPacketLost = false;
unsigned __int32 total_out = 0;
Zlib::ZlibData ddata(StPt, size, *stream, isInit, isPacketLost);
auto IsOk = zlib->Decoder(ddata, out_buf, total_out);
zlib->Reset(*stream, isInit);
--size;
++StPt;
}
}
は、ラッパー関数を膨らま:
bool Zlib::Decoder(const DeflateData & ddata, BYTE *& out_data, unsigned __int32 & size)
{
if (IsDllLoaded == false || ddata.PDU == nullptr || ddata.PDU_size == 0)
return false;
z_stream_s & strm = ddata.stream;
if (!ddata.isInitialized)
Init(ddata);
strm.total_out = 0;
strm.avail_in = ddata.PDU_size;
strm.next_in = ddata.PDU;
strm.avail_out = OUT_BUFFER_SIZE;
strm.next_out = out_buffer;
__int32 ret = 0;
bool isWasSync = false;
ret = ZDecompressor(&strm, Z_SYNC_FLUSH);
size = strm.total_out;
if ((ret = 0) || (size > 10))
printf("Found!!");
out_data = out_buffer;
return true;
}
私はすごいについて多くを知らないが、パケットは、 '00 00 00 FFのff'で終わる場合、それは' 00 00 FFのff'で終わることを意味するものではないこと? –
はい、あなたは正しいですが、他のストリームでは、それ以前に00 00 ff ff wihtout 00しか見ませんでした。それで、私がそう言っているのです。 –
余分な「00」がペイロードの一部である可能性があります。 –