Добрый день! Я незарегистрирован в ЖЖ, так что сори, что "инкогнито". Просто ваша статья про DEFLATE мне очень помогла в том, чтобы разобраться. Моя цель собственно не раскодировать, а закодировать. Однако что-то с динамическим Хаффманом у меня не складывается. Уже сократил собственно кодируемые (в смысле распакованные) байты до 2х, но всё равно не понимают программы мою кодировку. Вы не могли бы попробовать раскодировать следующее 78 9C 05 20 00 49 F6 4F 61 54 01 00 04 02 00 A2 00 A1 (это выделен чисто zlib, включая заголовок и Adler32) и может подскажете что не так? Потому что я уже с ума схожу, всё перепроверил десятки раз - ну не вижу, что не так...
у меня декодировалось два байта с кодами 00 и a0 но это я не руками, а программно, то есть подробности не смотрел. и мой код сразу отбрасывает первые два и последние четыре байта, т.е. адлера не проверяет
а zlib (питоновский) на это выбрасывает "zlib.error: Error -3 while decompressing data: invalid code lengths set"
Кстати если у Вас есть почта, можно по ней попробовать. Я просто скоро уеду на две недели, отвечать не смогу, потом отвечу, но чтобы Вы ответы прочитали -- проще по почте. Свой адрес добавил в пост.
Спасибо огромное! Действительно помогло. Мне и в голову не приходило такое. Я ведь большие массивы пробовал с кодами меньшей длины и всё равно что-то не получалось. Тут уже всё сократил до минимума (8-битные коды были выбраны чисто из-за того, чтобы меньший перечень HCLEN использовать).
Так получается, что нужно обязательно использовать все длины кодов с единицы? (Потому как пробовал только двойки - не прошло). Тогда мне не понятно почему нужно было создавать этот перечень длин в таком странном порядк, где единица предпоследняя...
> Тогда мне не понятно почему нужно было создавать этот перечень длин в таком странном порядк, где единица предпоследняя...
обычно единица не требуется, у Вас просто очень мало символов, тут по хорошему вообще не нужно было ничего сжимать, меньше места бы занимало. Схема рассчитана на то, чтобы быть оптимальной в среднем случае, а не в каждом.
Да это ж для пробы было, просто вручную уже запереписывался этими кодами... А вручную надо, чтобы понять все нюансы. Просто смущало то, что начинал я с массива в где-то 110 байт и там было что сжимать. Пользовал 3х значные коды (как мне казалось, что одной длины ведь удобнее), но тоже что-то не получалось, хотя... мне кажется я догадываюсь где там могли быть ещё ошибки. В общем ладно, будем ещё экперементировать. А вам спасибо ещё раз!
Я незарегистрирован в ЖЖ, так что сори, что "инкогнито". Просто ваша статья про DEFLATE мне очень помогла в том, чтобы разобраться.
Моя цель собственно не раскодировать, а закодировать. Однако что-то с динамическим Хаффманом у меня не складывается. Уже сократил собственно кодируемые (в смысле распакованные) байты до 2х, но всё равно не понимают программы мою кодировку.
Вы не могли бы попробовать раскодировать следующее 78 9C 05 20 00 49 F6 4F 61 54 01 00 04 02 00 A2 00 A1 (это выделен чисто zlib, включая заголовок и Adler32) и может подскажете что не так?
Потому что я уже с ума схожу, всё перепроверил десятки раз - ну не вижу, что не так...
Reply
но это я не руками, а программно, то есть подробности не смотрел.
и мой код сразу отбрасывает первые два и последние четыре байта, т.е. адлера не проверяет
а zlib (питоновский) на это выбрасывает "zlib.error: Error -3 while decompressing data: invalid code lengths set"
интересно, попробую разобраться
Reply
Reply
Кстати если у Вас есть почта, можно по ней попробовать. Я просто скоро уеду на две недели, отвечать не смогу, потом отвечу, но чтобы Вы ответы прочитали -- проще по почте. Свой адрес добавил в пост.
Reply
я его причешу и выложу на гихаб, но попозже.
Reply
Reply
Действительно помогло. Мне и в голову не приходило такое. Я ведь большие массивы пробовал с кодами меньшей длины и всё равно что-то не получалось. Тут уже всё сократил до минимума (8-битные коды были выбраны чисто из-за того, чтобы меньший перечень HCLEN использовать).
Так получается, что нужно обязательно использовать все длины кодов с единицы? (Потому как пробовал только двойки - не прошло). Тогда мне не понятно почему нужно было создавать этот перечень длин в таком странном порядк, где единица предпоследняя...
Reply
Reply
обычно единица не требуется, у Вас просто очень мало символов, тут по хорошему вообще не нужно было ничего сжимать, меньше места бы занимало. Схема рассчитана на то, чтобы быть оптимальной в среднем случае, а не в каждом.
Reply
В общем ладно, будем ещё экперементировать. А вам спасибо ещё раз!
Reply
Leave a comment