Неизвестный метод сжатия - PullRequest
0 голосов
/ 05 марта 2019

В базе данных есть столбец BLOB-объектов с данными диаграммы.

Данные были сжаты, к сожалению, я пробовал разные решения, но ни одно из них не сработало.Какой тип сжатия это?никто из проверенных не работает.Я протестировал zip, bzip, zlib, gzip2 и т. Д.

Вот пример из базы данных:

5a 49 50 08 52 00 00 78 9c ed 9c 0b 54 56 55 fe (...)

Полный двоичный файл: https://www.paste.org/97372

После преобразования в ascii первыйтри символа "ZIP" (четвертый символ всегда случайный, что означает для меня это конец заголовка), но я не могу найти этот тип сжатия.

Я проверил другие BLOB-объекты и нахожу "789с "всегда на одной позиции.Затем я пытаюсь ZLIB.NET:

 public static void DecompressData(byte[] inData, out byte[] outData)
    {
        using (MemoryStream outMemoryStream = new MemoryStream())
        using (ZOutputStream outZStream = new ZOutputStream(outMemoryStream))
        using (Stream inMemoryStream = new MemoryStream(inData))
        {
            CopyStream(inMemoryStream, outZStream);
            outZStream.finish();
            outData = outMemoryStream.ToArray();
        }
    }

    public static void CopyStream(System.IO.Stream input, System.IO.Stream output)
    {
        byte[] buffer = new byte[2000]; //example
        int len;
        while ((len = input.Read(buffer, 0, 2000)) > 0)
        {
            output.Write(buffer, 0, len);
        }
        output.Flush();
    }

К сожалению, появляется та же ошибка:

zlib.ZStreamException: «накачивание: неизвестный метод сжатия»

1 Ответ

0 голосов
/ 07 марта 2019

78 9c - заголовок потока zlib. Действительно, 10 752 байта с этого момента являются действительным потоком zlib, который распаковывается до 21 000 байтов. Четыре байта после "ZIP" и перед 78 9c, то есть 08 52 00 00, представляют собой число 21 000 в младшем порядке.

Таким образом, ваш формат - "ZIP", за которым следует несжатый размер в четыре байта в порядке с прямым порядком байтов, за которым следует поток zlib.

...