Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Кац также разработал оригинальный алгоритм, используемый для создания потоков Deflate. Этот алгоритм был запатентован как патент США 5,051,745 и переуступлен PKWARE, Inc. [2] [3] Как указано в документе RFC, широко считалось, что алгоритм создания файлов Deflate может быть реализован способом, не охваченным патентами. [1] Это привело к его широкому использованию - например, в файлах, сжатых с помощью gzip, и файлах изображений PNG , в дополнение к формату файлов ZIP , для которого он был первоначально разработан Кацем. Срок действия патента истек.

Формат потока [ править ]

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

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

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

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

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

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

Битовое сокращение [ править ]

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

Создается дерево, содержащее место для 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 количество дополнительных битов можно рассчитать как .

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

Удаление повторяющейся строки [ править ]

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

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

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

Кодировщик / компрессор [ править ]

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

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

Deflate64 / Enhanced Deflate [ править ]

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

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

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

Реализации кодировщика [ править ]

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

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 прилагается " " специализированная утилита ", способная использовать аппаратное сжатие из Apache . Аппаратное обеспечение основано на ПЛИС Xilinx Virtex и четырех специализированных ASIC AHA3601.ahagzipmod_deflate_aha . Платы 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.
  • ZipAccel-С от CAST Inc . Это ядро ​​Silicon IP, поддерживающее сжатие Delfate, Zlib и Gzip . ZipAccel-C может быть реализован в ASIC или FPGA , поддерживает как динамические, так и статические таблицы Хаффмана и может обеспечивать пропускную способность, превышающую 100 Гбит / с. Компания предлагает эталонные конструкции плат ускорителей сжатия / декомпрессии для Intel FPGA ( ZipAccel-RD-INT ) и Xilinx FPGA ( ZipAccel-RD-XIL ).
  • Набор микросхем Intel Communications серии 89xx (Cave Creek) для процессоров Intel Xeon E5-2600 и E5-2400 (Sandy Bridge-EP / EN) поддерживает аппаратное сжатие и распаковку с использованием технологии QuickAssist. В зависимости от набора микросхем доступны скорости сжатия и распаковки 5 Гбит / с, 10 Гбит / с или 20 Гбит / с. [10]

Декодер / декомпрессор [ править ]

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

Реализации только для надувания [ править ]

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

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

Аппаратные декодеры [ править ]

  • Serial Inflate GPU от BitSim. Аппаратная реализация Inflate. Часть BitSim в BADGE (Bitsim Accelerated Graphics Engine Display) контроллера размещения для встраиваемых систем.
  • Реализация HDL-Deflate GPL FPGA.
  • ZipAccel-D от CAST Inc . Это ядро ​​Silicon IP, поддерживающее распаковку файлов Delfate, Zlib и Gzip . IP-ядро ZipAccel-D, которое может быть реализовано в ASIC или FPGA. Компания предлагает эталонные конструкции плат ускорителей сжатия / декомпрессии для Intel FPGA ( ZipAccel-RD-INT ) и Xilinx FPGA ( ZipAccel-RD-XIL ).

См. Также [ править ]

  • Список форматов архивов
  • Список файловых архиваторов
  • Сравнение файловых архиваторов

Ссылки [ править ]

  1. ^ a b Deutsch, L. Peter (май 1996 г.). DEFLATE Спецификация формата сжатых данных версии 1.3 . IETF . п. 1 сек. Абстрактный. DOI : 10,17487 / RFC1951 . RFC 1951 . Проверено 23 апреля 2014 .
  2. ^ Патент США 5051745 , Katz, Phillip W. , "Строка Searcher, и компрессор Использование Same", опубликованная 1991-09-24, выданный 1991-09-24 
  3. ^ Дэвид, Саломон (2007). Сжатие данных: полный справочник (4-е изд.). Springer. п. 241. ISBN. 978-1-84628-602-5.
  4. ^ «Двоичная сущность - Deflate64» . Архивировано 21 июня 2017 года . Проверено 22 мая 2011 года .CS1 maint: bot: original URL status unknown (link)
  5. ^ "Двоичная сущность -" Сравнение компрессии "Калгари Корпус" . Архивировано 27 декабря 2017 года . Проверено 22 мая 2011 года .CS1 maint: bot: original URL status unknown (link)
  6. ^ 7-Zip Руководство и документация - метод сжатия
  7. ^ История алгоритмов сжатия данных без потерь - Deflate64
  8. ^ zlib FAQ - Поддерживает ли zlib новый формат «Deflate64», представленный PKWare?
  9. ^ «Высокопроизводительное сжатие DEFLATE с оптимизацией для наборов геномных данных» . Программное обеспечение Intel . 1 октября 2019 . Проверено 18 января 2020 года .
  10. ^ «Процессоры Intel® Xeon® серии E5-2600 и E5-2400 с набором микросхем Intel® серии 89xx» . Проверено 18 мая 2016 .

Внешние ссылки [ править ]

  • PKWARE, Inc. «s appnote.txt, .ZIP Формат файла спецификации ; Раздел 10, X. Спускание воздуха - Метод 8 .
  • RFC 1951 - спецификация формата сжатых данных Deflate версия 1.3
  • Домашняя страница zlib
  • Объяснение алгоритма сдува - Антей Полевой шпат
  • Extended Application of Suffix Trees to Data Compression – an excellent algorithm to implement Deflate by Jesper Larsson
  • Zip Files: History, Explanation and Implementation – walk-through of a Deflate implementation