3

ネットワークキャプチャファイル(PCAP)の圧縮バイトからデータを抽出しようとしています。

これらのパケットの一部からのデータにはZLIBヘッダー(最初の2バイト、最初のバイトの下位4ビットは常に8)がないため、を使用して解凍しようとすると例外が発生しましたZlibStream。ヘッダー付きのデータは正常に機能しているようです。

ZLIBはDEFLATEの単なるヘッダーとフッターであることを理解しているので、ヘッダーなしでこれらのデータをに渡しますDeflateStream。今回DeflateStreamはエラーをスローしません、それは間違ったデータを与えただけです(しかしそれは正しい長さを与えました)...

これはサンプルデータです。C#コードサンプルはDotNetZipを使用しています。

byte[] test3 = new byte[] { 0x1a, 0x6d, 0xf, 0x8d, 0xb6, 0x87, 0x46, 0xdb, 0x43, 0xa3, 0xed, 0xa1, 0xd1, 
                0xf6, 0xd0, 0x68, 0x7b, 0x68, 0xb4, 0x3d, 0x34, 0xda, 0x1e, 0xb2, 0x44, 0x3a, 0x39, 0x6f, 0x24, 
                0xae, 0x1f, 0x2, 0x0, 0x0, 0x0, 0xff, 0xff };


static void UncompressData(byte[] data)
{
    if ((data[0] & 0x0F) != 0x08)
    {        
        var uncompressed = DeflateStream.UncompressBuffer(data);
        Console.WriteLine("Uncompressed Deflate data : {0} => {1} bytes", data.Length, uncompressed.Length);
    }
    else
    {
        var uncompressed = ZlibStream.UncompressBuffer(data);
        Console.WriteLine("Uncompressed ZLIB data : {0} => {1} bytes", data.Length, uncompressed.Length);
    }
}

私はC#(DotNetZipから)とJavaでSystem.IO.Compression.DeflateStreamテストしました。すべてが0でいっぱいの同様の配列を与えました..Ionic.Zlib.DeflateStreamjava.util.zip.Inflater

ここで何が欠けている可能性があるかについてのアイデアはありますか?ZLIB / DEFLATEがステートフルであり、解凍に以前のすべてのパケットからのデータが必要である可能性はありますか?

ありがとうございました。

4

1 に答える 1

2

はい、「ファイル」全体が必要です。個々のパケットを個別にデフレートすることはできません。

zlibのドキュメントから、ファイル内のさまざまなポイントからdeflateを開始することができます。ただし、そこから収縮を開始するには、これらのポイントがどこにあるかを正確に知る必要があるため、パズルの圧縮の半分を完全に制御する必要があります。そして、それらはまだ(おそらく)「パケット」の境界を破ることはありません。

于 2011-06-01T12:48:32.203 に答える