Я хочу лучше понять кодировку 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 ..