Невозможно распаковать данные ZLIB / DEFLATE - PullRequest
3 голосов
/ 01 июня 2011

Я пытаюсь извлечь данные из сжатых байтов из файла захвата сети (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 # System.IO.Compression.DeflateStream, Ionic.Zlib.DeflateStream (из DotNetZip ) и Java java.util.zip.Inflater. Все дали похожий массив, полный 0s ..

Есть идеи о том, что здесь может отсутствовать? Возможно ли, что ZLIB / DEFLATE находится в состоянии и для декомпрессии требуются данные из всех предыдущих пакетов?

Спасибо.

1 Ответ

2 голосов
/ 01 июня 2011

Да, вам нужен весь «файл», вы не можете дефлировать отдельные пакеты в отдельности.

Из документации zlib можно начать дефляцию из разных точек файла.Тем не менее, вам нужно иметь полный контроль над половиной сжатия головоломки, так как вы должны точно знать, где находятся эти точки, чтобы начать отдуваться оттуда.И они все еще (вероятно) не сломались бы на границах "пакета".

...