?

Log in

No account? Create an account

Previous Entry Share Next Entry
GZip, затянись с нами.
mikelsv
Хотите разобраться, как работают архиваторы? Правильно, да ну нафик. Эти алгоритмы, какие-то структуры и все такое прочее. А мне внезапно оказалось надо, надо так, что без вариантов. Разобраться как создать gzip. В начале все казалось просто, взять стандартную функцию inflate() из zlib и прикрутить к ней шапку. То есть даже проще чем казалось. И тут начались чудеса. Беру шапку gzip + inflate(text) + crc(text) + text.sz. Нифига не работает, архиватор не хочет это понимать. После чего путем хитрых манипуляций со сжатием "1" и сравнением результатов выяснилось, что реальная формула то: gzip header + inflate(text).str(2, text.sz-6) + crc(text) + text.sz. Не решаюсь сказать, что курили разработчики, но затягивались явно здорово.
Распаковка идет по тому же принципу. К данным из gzip файла спереди присобачиваются те же оторванные 2 байта и текст разжимается в deflate(). Разжимается с криками и визгом. Видно не хватает тех четырех байт, но как их генерировать я не понял, да и rfc вроде как молчит и не колется. Если узнаете, скажите. Ага?

Ну и да, можете себя поздравить, вы только что осилили один из форматов сжатия.