Понимание IDAT, чтение динамического дерева Хаффмана в DEFLATE - PullRequest
0 голосов
/ 01 ноября 2018

Я хочу лучше понять кодировку zlib, deflate и PNG. С учетом сказанного у меня возникли проблемы с применением спецификаций RFC-1950 и RFC-1951 к IDAT-части PNG.

Ниже приведен двоичный код для изображения.

Пример изображения 50x50, все пиксели RGB (255,0,0).

Хорошо, после IDAT ожидайте два байта, указанных zlib; CMF [0000029], затем FLG [000002a] (без FLG.FDICT). Как и ожидалось, гекс равен 78DA, что означает использование DEFLATE, 32K окна и высокий уровень сжатия.

Начиная с младшего значащего бита следующего байта, будет три бита для заголовка DEFLATE, один бит для указания последнего блока и два бита для типа сжатия (нет, фиксированный или динамический) [000002b].

Чтобы прочитать биты, см. this .

0000024: 01000011 01001001 01000100 01000001 01010100 01111000  CIDATx
000002a: 11011010 11101101 11001111 00110001 00010001 00000000  ...1..
0000030: 00000000 00001000 00000000 10100001 11101111 01011111  ....._
0000036: 01011010 00110011 10111000 01111010 00001100 00000100  Z3.z..
000003c: 10100000 10101001 11111001 00100000 00010001 00010001  ... ..
0000042: 00010001 00010001 00010001 00010001 00010001 00010001  ......
0000048: 00010001 00010001 00010001 00010001 00010001 00010001  ......
000004e: 00010001 00010001 00010001 00010001 00010001 00010001  ......
0000054: 00010001 00010001 00010001 00010001 00010001 00010001  ......
000005a: 00010001 00010001 00010001 00010001 00010001 00010001  ......
0000060: 00010001 00010001 00010001 00010001 00010001 10010001  ......
0000066: 10001011 00000101 10110000 00110011 01110101 10010110  ...3u.
000006c: 01111001 11000101 00011100 10110001 00000000 00000000  y.....
0000072: 00000000 00000000 01001001 01000101 01001110 01000100  ..

1 Ответ

0 голосов
/ 02 ноября 2018

Следующие три бита находятся снизу 11101101. 101 - это 10 для динамического блока и 1, указывающее, что это последний блок. Это запускает 61-байтовый поток дефляции, который декодируется в следующее (как разобран infgen ):

last
dynamic
litlen 0 2
litlen 255 4
litlen 256 4
litlen 274 4
litlen 283 4
litlen 285 1
dist 3 1
dist 15 1
literal 0 255 0 0 255
match 196 4
literal 0
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 44 4
end

Первый распакованный байт равен нулю и распаковывается до 10 050 байт.

...