DEFLATE

редактировать

В вычислениях, Deflate - это без потерь сжатие данных формат файла, в котором используется комбинация LZSS и кодирования Хаффмана. Он был разработан Филом Кацем для версии 2 его инструмента архивирования PKZIP. Позже Deflate был описан в RFC 1951 (1996).

Кац также разработал оригинальный алгоритм, используемый для создания потоков Deflate. Этот алгоритм был запатентован как U.S. Патент 5051745, переуступленный PKWARE, Inc. Как указано в документе RFC, широко считалось, что алгоритм создания файлов Deflate может быть реализован способом, не охваченным патентами. Это привело к его широкому использованию, например, в сжатых файлах gzip и файлах изображений PNG в дополнение к формату файлов ZIP, для которого он был первоначально разработан Кацем. Срок действия патента истек.

Содержание
  • 1 Формат потока
    • 1.1 Устранение повторяющейся строки
    • 1.2 Битовое сокращение
  • 2 Кодер / компрессор
    • 2.1 Deflate64 / Enhanced Deflate
  • 3 Использование Deflate в новом программном обеспечении
    • 3.1 Реализации кодировщика
    • 3.2 Аппаратные кодеры
  • 4 Декодер / декомпрессор
    • 4.1 Реализации только с расширением
    • 4.2 Аппаратные декодеры
  • 5 См. Также
  • 6 Ссылки
  • 7 Внешние ссылки
Формат потока

Поток Deflate состоит из серии блоков. Каждому блоку предшествует 3- бит заголовок:

  • Первый бит: маркер последнего блока в потоке:
    • 1: это последний блок в потоке.
    • 0: Там - это еще блоки, которые нужно обработать после этого.
  • Второй и третий биты: Метод кодирования, используемый для этого типа блока:
    • 00: Сохраненный (также известный как необработанный или буквальный) раздел длиной от 0 до 65 535 байтов
    • 01: Статический сжатый блок Хаффмана с использованием предварительно согласованного дерева Хаффмана, определенного в RFC
    • 10: Сжатый блок с предоставленной таблицей Хаффмана
    • 11: Зарезервировано - не использовать.

Параметр сохраненного блока добавляет минимум накладные расходы и используется для несжимаемых данных.

Наиболее сжимаемые данные будут закодированы с использованием метода 10, динамического кодирования Хаффмана, который создает оптимизированное дерево Хаффмана, настроенное для каждого блока данных индивидуально. Инструкции по созданию необходимого дерева Хаффмана следуют сразу за заголовком блока. Статическая опция Хаффмана используется для коротких сообщений, где фиксированная экономия, полученная за счет исключения дерева, перевешивает процентную потерю сжатия из-за использования неоптимального (таким образом, технически не Хаффмана) кода.

Сжатие достигается в два этапа:

  • Сопоставление и замена повторяющихся строк указателями.
  • Замена символов новыми, взвешенными символами в зависимости от частоты использования.

Дублирующаяся строка исключение

Внутри сжатых блоков, если обнаруживается повторяющаяся серия байтов (повторяющаяся строка), тогда вставляется обратная ссылка , вместо этого добавляется ссылка на предыдущее местоположение этой идентичной строки. Закодированное совпадение с более ранней строкой состоит из 8-битной длины (3–258 байтов) и 15-битного расстояния (1–32 768 байтов) до начала дубликата. Относительные обратные ссылки могут быть сделаны по любому количеству блоков, если расстояние появляется в пределах последних 32 KiB декодированных несжатых данных (так называемое скользящее окно).

Если расстояние меньше длины, дубликат перекрывает сам себя, указывая на повторение. Например, серия из 10 идентичных байтов может быть закодирована как один байт, за которым следует дубликат длиной 9, начиная с предыдущего байта.

Поиск в предыдущем тексте повторяющихся подстрок - это наиболее затратная часть алгоритма DEFLATE и операция, на которую влияют настройки уровня сжатия.

Битовое сокращение

Второй этап сжатия состоит из замены обычно используемых символов более короткими представлениями и менее часто используемых символов более длинными представлениями. Используемый метод - это кодирование Хаффмана, которое создает дерево без префикса неперекрывающихся интервалов, где длина каждой последовательности обратно пропорциональна логарифму вероятности того, что этот символ должен быть закодирован. Чем больше вероятность того, что символ должен быть закодирован, тем короче будет его битовая последовательность.

Создается дерево, содержащее пространство для 288 символов:

  • 0–255: представляют буквальные байты / символы 0–255.
  • 256: конец блока - остановить обработку, если последний блок, в противном случае начать обработку следующего блока.
  • 257–285: в сочетании с дополнительными битами, длина совпадения составляет 3–258 байт.
  • 286, 287: не используется, зарезервировано и недопустимо, но по-прежнему является частью дерева.

За кодом длины совпадения всегда следует код расстояния. На основе считанного кода расстояния могут быть считаны дополнительные "лишние" биты для получения окончательного расстояния. Дерево расстояний содержит пространство для 32 символов:

  • 0–3: расстояния 1–4
  • 4–5: расстояния 5–8, 1 дополнительный бит
  • 6–7: расстояния 9 –16, 2 дополнительных бита
  • 8–9: расстояния 17–32, 3 дополнительных бита
  • ...
  • 26–27: расстояния 8,193–16,384, 12 дополнительных биты
  • 28–29: расстояния 16,385–32,768, 13 дополнительных битов
  • 30–31: не используются, зарезервированы и недопустимы, но все же являются частью дерева.

Обратите внимание, что для соответствия символы расстояния 2–29, количество дополнительных битов можно рассчитать как ⌊ n 2 ⌋ - 1 {\ displaystyle \ left \ lfloor {\ frac {n} {2}} \ right \ rfloor -1}{\ displaystyle \ left \ lfloor {\ frac {n} {2}} \ right \ rfloor -1 } .

Два кода (288-символьное / литеральное дерево и 32-символьное дерево расстояний) сами кодируются как канонические коды Хаффмана, задавая битовую длину кода для каждого символа. Сами длины в битах закодированы по длине серий для получения как можно более компактного представления. В качестве альтернативы включению представления в виде дерева опция «статическое дерево» предоставляет стандартные фиксированные деревья Хаффмана. Сжатый размер с использованием статических деревьев может быть вычислен с использованием той же статистики (количество раз, когда каждый символ появляется), которая используется для генерации динамических деревьев, поэтому для компрессора легко выбрать тот, который меньше.

Кодер / компрессор

На этапе сжатия именно кодировщик выбирает время, затрачиваемое на поиск совпадающих строк. Эталонная реализация zlib / gzip позволяет пользователю выбирать из скользящей шкалы вероятного результирующего уровня сжатия в зависимости от скорости кодирования. Варианты варьируются от 0(не пытаться сжать, просто сохранять в несжатом виде) до 9, представляя максимальные возможности эталонной реализации в zlib / gzip.

Были созданы другие кодеры Deflate, все из которых также будут создавать совместимый битовый поток, который может быть распакован любым существующим декодером Deflate. Разные реализации, вероятно, будут давать вариации в конечном созданном закодированном битовом потоке. В версиях кодировщика, отличных от zlib, основное внимание уделялось созданию более эффективно сжатого и закодированного потока меньшего размера.

Deflate64 / Enhanced Deflate

Deflate64, указанный PKWARE, является частным вариантом Deflate. Принципиально тот же алгоритм. Что изменилось, так это увеличение размера словаря с 32 КБ до 64 КБ, расширение кодов расстояния до 16 бит, чтобы они могли адресовать диапазон в 64 КБ, и код длины, который увеличен до 16 бит, чтобы он может определять длину от трех до 65 538 байтов. Это приводит к тому, что Deflate64 имеет более длительное время сжатия и потенциально немного более высокую степень сжатия, чем Deflate. Некоторые бесплатные проекты и / или проекты с открытым исходным кодом поддерживают Deflate64, например 7-Zip, в то время как другие, такие как zlib, не поддерживают его из-за проприетарного характера процедуры и очень скромное увеличение производительности по сравнению с Deflate.

Использование Deflate в новом программном обеспечении

Реализации Deflate бесплатно доступны на многих языках. Программы на C обычно используют библиотеку zlib (под лицензией zlib License, которая позволяет использовать как бесплатное, так и проприетарное программное обеспечение). Программы, написанные с использованием диалектов Паскаля Borland, могут использовать paszlib; библиотека C ++ включена как часть 7-Zip / AdvanceCOMP. Java включает поддержку как часть стандартной библиотеки (в java.util.zip). Библиотека базовых классов Microsoft.NET Framework 2.0 поддерживает его в пространстве имен System.IO.Compression. Программы на Ada могут использовать Zip-Ada (чистый) или ZLib-Ada с толстой привязкой к zlib.

Реализации кодировщика

  • PKZIP : первая реализация, первоначально сделанная Филом Кацем как часть PKZip.
  • zlib / gzip : стандартная эталонная реализация, используемая в огромном количестве программного обеспечения, благодаря общедоступности исходного кода и лицензии, разрешающей включение в другое программное обеспечение.
  • Crypto ++ : содержит реализацию в общественном достоянии на C ++ направлен в основном на уменьшение потенциальных уязвимостей безопасности. Автор, Вей Дай, заявляет: «Этот код менее умен, но, надеюсь, более понятен и удобен в обслуживании [чем zlib] ".
  • 7-Zip / AdvanceCOMP : написано Игорем Pavlov в C ++, эта версия свободно лицензируется и имеет тенденцию обеспечивать более высокое сжатие, чем zlib, за счет использования ЦП. Имеется возможность использовать формат хранения DEFLATE64.
  • PuTTY 'sshzlib.c': автономная реализация, способная к полному декодированию, но только к созданию статического дерева, от Саймона Тэтэма. MIT по лицензии.
  • Plan 9 от Bell Labs операционной системы libflate реализует сжатие с дефляцией.
  • Hyperbac : использует собственную проприетарную библиотеку сжатия без потерь (написанную на C ++ и ассемблере) с возможностью реализации формата хранения DEFLATE64.
  • Zopfli : реализация C от Google, которая обеспечивает максимальное сжатие за счет использования ЦП. ZopfliPNG - это вариант Zopfli для использования с PNG. Лицензированный Apache.
  • igzip, кодировщик, написанный на ассемблере x86 r одобрено Intel по лицензии MIT. В 3 раза быстрее, чем zlib -1. Полезно для сжатия геномных данных.

AdvanceCOMP использует версию Deflate с более высокой степенью сжатия, реализованную в 7-Zip (или, возможно, Zopfli в последних версиях), чтобы включить повторное сжатие gzip, Файлы PNG, MNG и ZIP с возможностью достижения меньшего размера файла, чем zlib при максимальных настройках.

Аппаратные кодировщики

  • AHA361-PCIX / AHA362-PCIX от Comtech AHA. Comtech выпустила карту PCI-X (PCI-ID: 193f: 0001), способную сжимать потоки с помощью Deflate со скоростью до 3,0 Гбит / с (375 МБ / с) для входящих несжатых данных. Вместе с ядром Linux драйвером для AHA361-PCIX есть утилита «ahagzip» и настроенный «mod_deflate_aha», способный использовать оборудование сжатие из Apache. Аппаратное обеспечение основано на Xilinx Virtex FPGA и четырех специализированных AHA3601 ASIC. Платы AHA361 / AHA362 ограничены обработкой только статических блоков Хаффмана и требуют модификации программного обеспечения для добавления поддержки - карты не могли поддерживать полную спецификацию Deflate, то есть они могли надежно декодировать только свой собственный вывод (поток, который не содержат любые динамические блоки Хаффмана типа 2).
  • StorCompress 300 / MX3 из Indra Networks. Это диапазон карт PCI (PCI-ID: 17b4: 0011) или PCI-X с от одного до шести модулей сжатия с заявленной скоростью обработки до 3,6 Гбит / с. (450 МБ / с). Доступны версии карт под отдельным брендом WebEnhance, специально разработанные для использования в Интернете, а не для SAN или резервного копирования; версии PCIe, также производится MX4E.
  • AHA363-PCIe / AHA364-PCIe / AHA367-PCIe. В 2008 году Comtech начала производить две карты PCIe (PCI-ID: 193f: 0363/ 193f: 0364) с новым чипом аппаратного кодировщика AHA3610. Новый чип был разработан с расчетом на постоянную скорость 2,5 Гбит / с. Используя два из этих чипов, плата AHA363-PCIe может обрабатывать Deflate со скоростью до 5,0 Гбит / с (625 МБ / с), используя два канала (два сжатия и два распаковки). Вариант AHA364-PCIe - это версия карты только для кодирования, предназначенная для исходящих балансировщиков нагрузки, и вместо этого имеет несколько наборов регистров, чтобы обеспечить 32 независимых виртуальных канала сжатия, питающих два физических механизма сжатия. Драйверы ядра Linux, Microsoft Windows и OpenSolaris доступны для обеих новых карт вместе с измененной системной библиотекой zlib, так что динамически связанные приложения могут автоматически использовать поддержку оборудования без внутренняя модификация. Плата AHA367-PCIe (PCI-ID: 193f: 0367) похожа на AHA363-PCIe, но использует четыре микросхемы AHA3610 для устойчивой скорости сжатия 10 Гбит / с (1250 МБ / с). В отличие от AHA362-PCIX, механизмы декомпрессии на платах AHA363-PCIe и AHA367-PCIe полностью совместимы с дефляцией. Процессоры
  • Nitrox и Octeon от Cavium, Inc. содержат высокоскоростные аппаратные механизмы спуска и надувания, совместимые как с ZLIB, так и с GZIP, с некоторыми устройствами, способными обрабатывать несколько одновременных потоков данных.
  • HDL-Deflate реализация GPL FPGA.
  • Набор микросхем Intel Communications 89xx Series (Cave Creek) для процессоров серии Intel Xeon E5-2600 и E5-2400 (Sandy Bridge-EP / EN) поддерживает аппаратное сжатие и декомпрессию с использованием технологии QuickAssist. В зависимости от набора микросхем доступны скорости сжатия и декомпрессии 5, 10 или 20 Гбит / с.
Декодер / декомпрессор

Inflate - это процесс декодирования, который использует битовый поток Deflate для распаковки. и правильно производит исходные полноразмерные данные или файл.

Реализации только с расширением

Обычная цель альтернативной реализации с расширением - это сильно оптимизированная скорость декодирования или чрезвычайно предсказуемое использование ОЗУ для встроенных микроконтроллерных систем.

  • Сборка
    • 6502 inflate, написанная Петром Фусиком на 6502 языке ассемблера.
    • SAMflate, написанная Эндрю Коллиером на Z80 языке ассемблера с опциональной поддержкой подкачки памяти для SAM Coupé и доступен по условиям BSD / GPL / LGPL / DFSG лицензии.
    • gunzip, написанный Лореном Холстом на Z80 языке ассемблера для MSX, под лицензией BSD.
    • inflate.asm, быстрая и эффективная реализация на машинном языке M68000, написанная Кейром Фрейзером и выпущенная Майклом Коном в Public Domain.
  • C /C ++
    • kunzip и не имеющая отношения к "KZIP ". Поставляется с исходным кодом C под лицензией GNU LGPL. Используется в GIMP installer.
    • puff.c (zlib ), небольшой, не перегруженной, однофайловой справочной реализации, включенной в каталог / contrib / puff дистрибутив zlib.
    • tinf, написанный Йоргеном Ибсеном на ANSI C и поставляется с лицензией zlib. Добавляет около 2k кода.
    • tinfl.c (miniz ), реализация Inflate в общественном достоянии, полностью содержащаяся в одной функции C.
  • PCDEZIP, Боб Фландерс и Майкл Холмс, опубликовано в журнале PC Magazine 11 января 1994 г.
  • inflate.cl, автор: John Foderaro. Автономный декодер Common Lisp, распространяемый с лицензией GNU LGPL.
  • inflate.s7i / gzip.s7i, чистый- Seed7 реализация декомпрессии Deflate и gzip, Томас Мертес. Доступно по лицензии GNU LGPL.
  • pyflate, чистый Python автономный Deflate (gzip ) и bzip2 декодер Пола Слэйдена. Написано для исследований / создания прототипов и распространяется по лицензиям BSD / GPL / LGPL / DFSG.
  • deflatelua, чистая реализация Lua декомпрессии Deflate и gzip / zlib, автор Дэвид Манура.
  • inflate реализация Inflate на чистом Javascript Крис Дикинсон
  • pako : Оптимизированный для скорости JavaScript порт zlib. Содержит отдельную сборку только с inflate.

Аппаратные декодеры

  • Serial Inflate GPU от BitSim. Аппаратная реализация Inflate. Часть контроллера BitSim BADGE (Bitsim Accelerated Display Graphics Engine), предлагающего для встроенных систем.
  • HDL-Deflate реализация GPL FPGA.
См. Также
Ссылки
Внешние ссылки
Последняя правка сделана 2021-05-16 08:52:50
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте