Значения длины из алгоритма deflate - PullRequest
4 голосов
/ 16 сентября 2011

Я сжал текст «TestingTesting», и результат в шестнадцатеричном формате был: 0B 49 2D 2E C9 CC 4B 0F 81 50 00. Я не могу определить коды длины и расстояния.Приведенный ниже двоичный файл перевернут, потому что RFC говорит, что нужно читать биты справа налево (спасибо Мэтью Слэттери за помощь).Вот что было проанализировано до сих пор:

1                       BFINAL (last block)
01                      BTYPE (static)
1000 0100   132-48=  84 T
1001 0101   149-48= 101 e
1010 0011   163-48= 115 s
1010 0100   164-48= 116 t
1001 1001   153-48= 105 i
1001 1110   158-48= 110 n
1001 0111   151-48= 103 g

Это оставшиеся биты, которые я не знаю, как анализировать:

1000 0100 0000 1000 0101 0000 0000 0

Последние 10 бит (конец значения блоках100) это единственная часть которую я могу разобрать.Я думаю, что значения длины и расстояния должны быть 7 (двоичный код 0111), так как длина «Тестирования» составляет 7 букв, и он копируется через 7 символов после текущей позиции, но я не могу понять, как это представляет это в остальныхбиты.Что я делаю не так?

1 Ответ

4 голосов
/ 17 сентября 2011

Расстояние код равно 5, но за кодом расстояния 5 следует один «дополнительный бит» для указания фактического расстояния 7 или 8. (См. Вторую таблицу в пункте 3.2.5 RFC.)

Полное декодирование данных:

1          BFINAL
01         BTYPE=static
10000100  'T'
10010101  'e'
10100011  's'
10100100  't'
10011001  'i'
10011110  'n'
10010111  'g'
10000100  another 'T'
0000100   literal/length code 260 = length 6
00101     distance code 5
0         extra bit  => the distance is 7
0000000   literal/length code 256 = end of block
...