Articulo de referencia

Desinflar

En informática , Deflate (estilizado como DEFLATE , y también llamado Flate [ 1 ] [ 2 ] ) es un algoritmo de compresión de datos sin pérdidas {{cite web |title=Supported formats...

En informática , Deflate (estilizado como DEFLATE , y también llamado Flate [ 1 ] [ 2 ] ) es un algoritmo de compresión de datos sin pérdidas [ a ] ​​que utiliza una combinación de codificación LZ77 y Huffman . Fue diseñado por Phil Katz para la versión 2 de su herramienta de archivado PKZIP . Deflate se especificó posteriormente en la Solicitud de Comentarios (RFC) 1951 (1996). [ 4 ]

Katz también diseñó el algoritmo original utilizado para construir flujos Deflate. Este algoritmo recibió la patente de software estadounidense 5,051,745 , asignada a PKWare , Inc. [ 5 ] [ 6 ] Como se indica en el documento RFC, se creía ampliamente que un algoritmo que produjera archivos Deflate podía implementarse de una manera no cubierta por patentes. [ 4 ] Esto llevó a su uso generalizado. Por ejemplo, en el formato de datos zlib , el formato de archivo gzip , el archivo de imagen Portable Network Graphics ( PNG ), el formato de archivo ZIP para el cual Katz lo diseñó originalmente. La patente ya ha expirado.

Estructura de bloques

La compresión Deflate toma cualquier secuencia de bytes y genera una secuencia de bloques (comúnmente llamada flujo Deflate ). La descompresión Deflate toma una secuencia de bloques y genera la secuencia original de bytes.

El orden de bytes es little-endian . El bit 0 es el bit menos significativo de un byte. [ 7 ]

Cada bloque tiene un encabezado de 3 bits con dos campos: [ 8 ]

  • BFINAL (primer bit): 1si este es el último bloque de la secuencia, de lo contrario 0.
  • BTYPE (los dos bits siguientes): Tipo de bloque
    • 00: Sin compresión (a veces llamado almacenado ). Cualquier bit hasta el límite del siguiente byte se ignora. El resto del bloque consta de LEN de 16 bits, NLEN de 16 bits ( complemento a uno de LEN) y LEN bytes de datos sin comprimir , es decir, hasta 65.535 ( 2¹⁶ - 1 ) bytes. Útil para datos incompresibles (por ejemplo, de alta entropía, aleatorios o ya comprimidos), añadiendo una sobrecarga mínima (es decir, ~5 bytes por bloque) .
    • 01: Un bloque comprimido Huffman estático , que utiliza un árbol Huffman previamente acordado y definido en el RFC.
    • 10: Un bloque Huffman comprimido dinámico , completo con la tabla Huffman suministrada.
    • 11: Reservado (error).

La mayoría de los datos comprimibles se codificarán mediante 10el método de codificación dinámica de Huffman , que genera un árbol de Huffman optimizado y personalizado para cada bloque de datos. Las instrucciones para generar el árbol de Huffman necesario se encuentran inmediatamente después del encabezado del bloque. La opción de Huffman estática se utiliza para mensajes cortos, donde el ahorro fijo que se obtiene al omitir el árbol compensa la pérdida de compresión porcentual debida al uso de un código no óptimo (y, por lo tanto, técnicamente no Huffman).

La compresión se logra mediante dos pasos:

  • Coincidencia y reemplazo de cadenas duplicadas con punteros
  • Sustitución de símbolos por nuevos símbolos ponderados en función de la frecuencia de uso.

Eliminación de cadenas duplicadas

Dentro de los bloques comprimidos, si se detecta una serie duplicada de bytes (una cadena repetida), se inserta una referencia inversa que enlaza con la ubicación anterior de esa cadena idéntica. Una coincidencia codificada con una cadena anterior consta de una longitud de 8 bits (3–258 bytes) y una distancia de 15 bits (1–32 768 bytes) hasta el inicio del duplicado. Se pueden realizar referencias inversas relativas a través de cualquier número de bloques, siempre que la distancia aparezca dentro de los últimos 32 KiB de datos decodificados sin comprimir (denominados ventana deslizante ). 

Si la distancia es menor que la longitud, el duplicado se superpone a sí mismo, lo que indica repetición. Por ejemplo, una secuencia de 10 bytes idénticos se puede codificar como un byte, seguido de un duplicado de longitud 9, comenzando con el byte anterior.

La búsqueda de subcadenas duplicadas en el texto precedente es la parte del algoritmo Deflate que requiere mayor capacidad de cálculo, y es la operación a la que afectan los ajustes del nivel de compresión.

Reducción de bits

La segunda etapa de compresión consiste en reemplazar los símbolos de uso común por representaciones más cortas y los menos comunes por representaciones más largas. El método empleado es la codificación Huffman , que crea un árbol sin prefijo de intervalos no superpuestos, donde la longitud de cada secuencia es inversamente proporcional al logaritmo de la probabilidad de que ese símbolo deba codificarse. Cuanto mayor sea la probabilidad de que un símbolo deba codificarse, más corta será su secuencia de bits.

Se crea un árbol que contiene espacio para 288 símbolos:

  • 0–255: representan los bytes/símbolos literales 0–255.
  • 256: fin del bloque: detenga el procesamiento si es el último bloque; de ​​lo contrario, comience a procesar el siguiente bloque.
  • 257–285: combinados con bits adicionales, una longitud de coincidencia de 3–258 bytes.
  • 286, 287: no se utilizan, están reservados y son ilegales, pero siguen formando parte del árbol.

Un código de longitud de coincidencia siempre irá seguido de un código de distancia. En función del código de distancia leído, se pueden leer bits adicionales para obtener la distancia final. El árbol de distancias contiene espacio para 32 símbolos:

  • 0–3: distancias 1–4
  • 4–5: distancias 5–8, 1 bit extra
  • 6–7: distancias 9–16, 2 bits adicionales
  • 8–9: distancias 17–32, 3 bits adicionales
  • ...
  • 26–27: distancias 8.193–16.384, 12 bits adicionales
  • 28–29: distancias 16.385–32.768, 13 bits adicionales
  • 30–31: no se utilizan, están reservados y son ilegales, pero aún forman parte del árbol.

Para los símbolos de distancia de coincidencia 2–29, el número de bits adicionales se puede calcular comonorte21{\displaystyle \left\lfloor {\frac {n}{2}}\right\rfloor -1}.

Los dos códigos (el árbol literal de longitud de 288 símbolos y el árbol de distancia de 32 símbolos) se codifican como códigos Huffman canónicos , especificando la longitud de bits del código para cada símbolo. Estas longitudes de bits se codifican mediante codificación de longitud de ejecución para obtener una representación lo más compacta posible. Como alternativa a la inclusión de la representación en árbol, la opción "árbol estático" proporciona árboles Huffman fijos estándar. El tamaño comprimido mediante los árboles estáticos se puede calcular utilizando las mismas estadísticas (el número de veces que aparece cada símbolo) que se emplean para generar los árboles dinámicos, lo que facilita al compresor la elección del tamaño más pequeño.

Codificador-compresor

Durante la etapa de compresión, el codificador decide el tiempo que se dedica a buscar cadenas coincidentes. La implementación de referencia de zlib/gzip permite al usuario seleccionar entre una escala variable que relaciona el nivel de compresión resultante con la velocidad de codificación. Las opciones van desde 0no intentar comprimir, sino almacenar sin comprimir, hasta 9representar la capacidad máxima de la implementación de referencia en zlib/gzip.

Se han desarrollado otros codificadores Deflate, todos los cuales también generan un flujo de bits compatible que puede ser descomprimido por cualquier decodificador Deflate existente. Es probable que las distintas implementaciones produzcan variaciones en el flujo de bits codificado final. El objetivo de las versiones de un codificador que no utilizan zlib suele ser generar un flujo codificado más pequeño y con una compresión más eficiente.

Deflate64

Deflate64, especificado por PKWARE, es una variante propietaria de Deflate. Es fundamentalmente el mismo algoritmo. Lo que ha cambiado es el aumento del tamaño del diccionario de 32  KB a 64  KB, una extensión de los códigos de distancia a 16  bits para que puedan direccionar un rango de 64  KB, y el código de longitud, que se extiende a 16 bits , para que pueda definir longitudes de tres a 65.538 bytes. [ 9 ] Esto hace que Deflate64 tenga un tiempo de compresión más largo y, potencialmente, una relación de compresión ligeramente superior a la de Deflate. [ 10 ] Varios proyectos gratuitos y/o de código abierto admiten Deflate64, como 7-Zip , [ 11 ] mientras que otros, como zlib , no lo hacen, porque el procedimiento es propietario, [ 12 ] y el aumento de rendimiento con respecto a Deflate es pequeño. [ 13 ]

Uso de Deflate en software nuevo

Las implementaciones de Deflate están disponibles gratuitamente en muchos lenguajes. Las aplicaciones escritas en C suelen usar la biblioteca zlib (bajo la permisiva licencia zlib ). Las aplicaciones en Borland Pascal (y lenguajes compatibles) pueden usar paszlib. Las aplicaciones en C++ pueden aprovechar la biblioteca Deflate mejorada en 7-Zip . Tanto Java como el framework .NET ofrecen soporte listo para usar para Deflate en sus bibliotecas (respectivamente, y System.IO.Compression ). Las aplicaciones en Ada pueden usar Zip-Ada (puro) o ZLib-Ada .java.util.zip

Implementaciones de codificadores

  • PKZIP : la primera implementación, realizada originalmente por Phil Katz como parte de PKZip.
  • zlib : implementación de referencia estándar adoptada en muchas aplicaciones debido a su licencia de código abierto y permisiva. Consulte Zlib §  Forks para ver bifurcaciones de mayor rendimiento.
  • Crypto++ : contiene una implementación de dominio público en C++ destinada a reducir posibles vulnerabilidades de seguridad . El autor, Wei Dai, afirma: " Este código es menos sofisticado, pero esperamos que sea más comprensible y fácil de mantener [que zlib] ".
  • 7-Zip : escrito por Igor Pavlov en C++ , esta versión tiene licencia libre y logra una mayor compresión que zlib a costa de un mayor uso de la unidad central de procesamiento (CPU). Incluye la opción de usar el formato de almacenamiento Deflate64.
  • PuTTY 'sshzlib.c': una implementación independiente bajo la licencia MIT por Simon Tatham, tiene capacidad de decodificación completa, pero solo admite la creación de árboles estáticos.
  • libflate: [ 14 ] parte del Plan 9 de Bell Labs , implementa la compresión deflate
  • Hyperbac : utiliza su propia biblioteca de compresión propietaria (en C++ y lenguaje ensamblador) con una opción para implementar el formato de almacenamiento Deflate64.
  • Zopfli : Implementación en C bajo la licencia Apache de Google ; logra una mayor compresión a costa de un mayor uso de la CPU. ZopfliPNG es una variante de Zopfli para usar con archivos PNG .
  • igzip: un codificador escrito en lenguaje ensamblador x86 , publicado por Intel bajo la licencia MIT . 3 veces más rápido que zlib-1. Útil para comprimir datos genómicos. [ 15 ]
  • libdeflate: [ 16 ] una biblioteca para compresión y descompresión rápida basada en Deflate de búfer completo. Libdeflate está altamente optimizada, especialmente en procesadores x86.

AdvanceCOMP utiliza las versiones de Deflate con mayor índice de compresión en 7-Zip, libdeflate y Zopfli para permitir la recompresión de archivos gzip , PNG , gráficos de red de imágenes múltiples (MNG) y ZIP con la posibilidad de obtener tamaños de archivo más pequeños que los que zlib puede lograr con la configuración máxima. [ 17 ]

Codificadores de hardware

  • AHA361-PCIX/AHA362-PCIX de Comtech AHA Archivado el 08-12-2006 en Wayback Machine . Comtech produjo una tarjeta PCI-X (PCI-ID: 193f:0001) capaz de comprimir flujos usando Deflate a una velocidad de hasta 3,0  Gbit/s (375  MB/s) para datos entrantes sin comprimir. Junto con el controlador de dispositivo del kernel de Linux para AHA361-PCIX hay una " " utilidad y " " personalizado capaz de usar la compresión de hardware de Apache . El hardware se basa en una matriz de puertas programables en campo (FPGA) Xilinx Virtex y cuatro circuitos integrados de aplicación específica (ASIC) AHA3601 personalizados. Las placas AHA361/AHA362 están limitadas a manejar solo bloques Huffman estáticos y requieren que se modifique el software para agregar soporte. Las tarjetas no podían admitir la especificación completa de Deflate, lo que significaba que solo podían decodificar de forma fiable su propia salida (una secuencia que no contenía ningún bloque dinámico de tipo 2 de Huffman).ahagzipmod_deflate_aha
  • StorCompress 300 / MX3 de Indra Networks . Se trata de una gama de tarjetas PCI (PCI-ID: 17b4:0011) o PCI-X que incorporan entre uno y seis motores de compresión con velocidades de procesamiento declaradas de hasta 3,6  Gbit/s (450  MB/s). Existe una versión de estas tarjetas con la marca independiente WebEnhance, diseñada específicamente para servidores web en lugar de redes de área de almacenamiento (SAN) o copias de seguridad; también se fabrica una revisión PCI Express (PCIe), la MX4E .
  • AHA363-PCIe / AHA364-PCIe / AHA367-PCIe . En 2008, Comtech comenzó a producir dos tarjetas PCIe ( PCI-ID: 193f:0363/ 193f:0364) con un nuevo chip codificador de hardware AHA3610. El nuevo chip fue diseñado para ser capaz de alcanzar una velocidad sostenida de 2,5  Gbit/s. Utilizando dos de estos chips, la tarjeta AHA363-PCIe puede procesar Deflate a una velocidad de hasta 5,0  Gbit/s (625 MB/s) utilizando los dos canales (dos de compresión y dos de descompresión). La variante AHA364-PCIe es una versión de la tarjeta solo de codificación diseñada para balanceadores de carga  salientes y, en su lugar, tiene múltiples conjuntos de registros para permitir 32 canales de compresión virtuales independientes que alimentan dos motores de compresión físicos. Hay controladores de dispositivo del kernel para Linux, Microsoft Windows y OpenSolaris disponibles para ambas tarjetas nuevas, junto con una biblioteca del sistema zlib modificada para que las aplicaciones vinculadas dinámicamente puedan usar automáticamente la compatibilidad del hardware sin modificaciones internas. La placa AHA367-PCIe ( ) es similar a la AHA363-PCIe, pero utiliza cuatro chips AHA3610 para una tasa de compresión sostenida de 10 Gbit/s (1250 MB/s). A diferencia de la AHA362-PCIX, los motores de descompresión de las placas AHA363-PCIe y AHA367-PCIe son totalmente compatibles con el estándar deflate.PCI-ID: 193f:0367  
  • Los procesadores Nitrox y Octeon de Cavium, Inc. contienen motores de inflado y desinflado de hardware de alta velocidad compatibles con ZLIB y GZIP, y algunos dispositivos pueden manejar múltiples flujos de datos simultáneos.
  • Implementación de HDL-Deflate GPL en FPGA.
  • ZipAccel-C de CAST Inc. es un núcleo IP de silicio compatible con compresión Deflate, Zlib y Gzip . ZipAccel-C se puede implementar en ASIC o matrices de puertas programables en campo (FPGA), admite tablas Huffman dinámicas y estáticas, y puede proporcionar velocidades de transmisión superiores a 100  Gbit/s. La empresa ofrece diseños de referencia de placas aceleradoras de compresión/descompresión para FPGA de Intel ( ZipAccel-RD-INT ) y FPGA de Xilinx ( ZipAccel-RD-XIL ).
  • El chipset Intel Communications Serie 89xx (Cave Creek) para los procesadores Intel Xeon  E5-2600 y E5-2400 (Sandy Bridge-EP/EN) admite compresión y descompresión por hardware mediante la tecnología QuickAssist. Según el chipset, se ofrecen velocidades de compresión y descompresión de 5 Gbit/s, 10  Gbit/s o 20  Gbit/s. [ 18 ]
  • Las CPU IBM z15 incorporan una versión mejorada de la aceleración de hardware Nest Accelerator Unit (NXU) de las tarjetas de expansión de entrada/salida (E/S) zEDC Express utilizadas en los sistemas z14 para la compresión y descompresión de hardware Deflate según lo especificado por RFC1951. [ 19 ] [ 20 ]
  • A partir de la arquitectura POWER9 , IBM añadió soporte de hardware para comprimir y descomprimir Deflate (según lo especificado por RFC 1951) al núcleo acelerador Nest (NX), anteriormente centrado en criptografía, introducido con POWER7 +. Este soporte está disponible para programas que se ejecutan con AIX 7.2 Technology Level 4 Expansion Pack o AIX 7.2 Technology Level 5 Service Pack 2 a través de la biblioteca zlibNX. [ 21 ] [ 22 ]

Decodificador, descompresor

Inflate es el proceso de decodificación que toma un flujo de bits Deflate para descomprimirlo y produce correctamente los datos o el archivo original de tamaño completo.

Implementaciones de solo inflado

La intención habitual con una implementación alternativa de Inflate es lograr una velocidad de decodificación altamente optimizada o un uso extremadamente predecible de la memoria de acceso aleatorio (RAM) para sistemas embebidos de microcontroladores .

Decodificadores de hardware

  • GPU Inflate serial de BitSim. Implementación de hardware de Inflate. Forma parte de la oferta de controladores Bitsim Accelerated Display Graphics Engine (BADGE) para sistemas embebidos.
  • Implementación de HDL-Deflate GPL en FPGA.
  • ZipAccel-D de CAST Inc. es un núcleo IP de silicio que admite la descompresión de archivos Deflate, Zlib y Gzip . El núcleo IP ZipAccel-D se puede implementar en ASIC o FPGA . La empresa ofrece diseños de referencia de placas aceleradoras de compresión/descompresión para FPGA de Intel ( ZipAccel-RD-INT ) y FPGA de Xilinx ( ZipAccel-RD-XIL ).
  • Las CPU IBM z15 incorporan una versión mejorada de la aceleración de hardware Nest Accelerator Unit (NXU) de las tarjetas de expansión de entrada/salida (E/S) zEDC Express utilizadas en los sistemas z14 para la compresión y descompresión de hardware Deflate según lo especificado por RFC1951. [ 19 ] [ 20 ]
  • A partir de la arquitectura POWER9 , IBM añadió soporte de hardware para comprimir y descomprimir Deflate (según lo especificado por RFC 1951) al núcleo acelerador Nest (NX), anteriormente centrado en criptografía, introducido con POWER7 +. Este soporte está disponible para programas que se ejecutan con AIX 7.2 Technology Level 4 Expansion Pack o AIX 7.2 Technology Level 5 Service Pack 2 a través de la biblioteca zlibNX. [ 21 ] [ 22 ]

Véase también

Notas

  1. Deflate se menciona con frecuencia como un algoritmo de compresión, aunque la especificación (RFC 1951) lo define como un "formato de datos". Por ejemplo, la especificación de la API web CompressionStream utiliza el término "El algoritmo DEFLATE". [ 3 ] En la práctica, el formato de datos es el resultado del algoritmo, por lo que ninguna de las definiciones es incorrecta.

Referencias

  1. Los autores de Go. "paquete flate - compress/flate - Paquetes Go" . El lenguaje de programación Go . Google . Consultado el 5 de septiembre de 2023. El paquete flate implementa el formato de datos comprimidos Deflate, descrito en el RFC número 1951.
  2. "PDF 32000-1:2008: Gestión de documentos — Formato de documento portátil — Parte 1: PDF 1.7" (PDF) . Adobe Open Source . Adobe Inc. pág. 23. Consultado el 5 de septiembre de 2023. FlateDecode [...] Descomprime datos codificados mediante el método de compresión zlib/deflate. 
  3. "Formatos compatibles" . Compresión WHATWG .
  4. 1 2 Deutsch, L. Peter (mayo de 1996). Especificación del formato de datos comprimidos Deflate versión 1.3 . Grupo de trabajo de ingeniería de Internet (IETF). pág. 1. sec. Resumen. doi : 10.17487/RFC1951 . RFC 1951. Recuperado el 23 de abril de 2014 .   
  5. ↑ Patente estadounidense 5051745 , Katz, Phillip W. , "Buscador de cadenas y compresor que utiliza el mismo", publicada el 24 de septiembre de 1991, emitida el 24 de septiembre de 1991, asignada a PKWare Inc. 
  6. Salomon, David (2007). Compresión de datos: La referencia completa (4.ª ed.). Springer. pág. 241. ISBN   978-1-84628-602-5.
  7. Convenciones generales . IETF . pág. 5. doi : 10.17487/RFC1951 . RFC 1951 . 
  8. Detalles del formato de bloque . IETF . pág. 9. doi : 10.17487/RFC1951 . RFC 1951 . 
  9. "Binary Essence – Deflate64" . Archivado del original el 21 de junio de 2017. Consultado el 22 de mayo de 2011 .{{cite web}}: CS1 maint: bot: estado de la URL original desconocido ( enlace )
  10. "Comparaciones de compresión de Binary Essence – "Corpus de Calgary"" . Archivado del original el 27 de diciembre de 2017. Recuperado el 22 de mayo de 2011 .{{cite web}}: CS1 maint: bot: estado de la URL original desconocido ( enlace )
  11. "-m (Configurar método de compresión) interruptor" . sevenzip.osdn.jp . Archivado del original el 09-04-2022 . Recuperado el 21-01-2023 .
  12. Historia de los algoritmos de compresión de datos sin pérdidas – Deflate64
  13. Preguntas frecuentes sobre zlib: ¿zlib admite el nuevo formato "Deflate64" introducido por PKWare?
  14. "Plan 9 de Bell Labs's /n/sources/plan9/sys/src/libflate" . plan9.bell-labs.com . Lucent Technologies. Archivado del original el 15 de marzo de 2006.
  15. "Compresión Deflate de alto rendimiento con optimizaciones para conjuntos de datos genómicos" . Intel Software . 1 de octubre de 2019. Consultado el 18 de enero de 2020 .
  16. "libdeflate" . Biblioteca altamente optimizada para la compresión y descompresión DEFLATE/zlib/gzip .
  17. ^ Mazzoleni, Andrea (21 de febrero de 2023). "amadvance/advancecomp" . GitHub .
  18. "Procesadores Intel Xeon de las series E5-2600 y E5-2400 con chipset de comunicaciones Intel de la serie 89xx" . Consultado el 18 de mayo de 2016 .
  19. 1 2 "Presentamos el IBM z15: la plataforma empresarial para la multinube híbrida de misión crítica" . IBM . 12 de septiembre de 2019. Consultado el 1 de noviembre de 2021 .
  20. 1 2 Lascu, Octavian (28 de abril de 2021). Guía técnica de IBM z15 (8562), página 97. IBM Redbooks. ISBN 9780738458991. Consultado el 1 de noviembre de 2021 .
  21. 1 2 "Compresión de datos mediante la biblioteca zlibNX - Documentación de IBM" . IBM . Consultado el 1 de noviembre de 2021 .
  22. 1 2 "Explotación de la aceleración en núcleo de los procesadores POWER para AIX" . Consultado el 1 de noviembre de 2021 .
  • Especificación del formato de archivo .ZIP de PKWareappnote.txt , Inc. Archivada el 05/12/2014 en Wayback Machine ; Sección 10, X. Descompresión – Método 8 .
  • RFC 1951 – Especificación del formato de datos comprimidos Deflate, versión 1.3 
  • Página principal de zlib
  • Explicación del algoritmo Deflate – por Antaeus Feldspar
  • Aplicación extendida de árboles de sufijos a la compresión de datos Archivado el 23/09/2016 en Wayback Machine : un excelente algoritmo para implementar Deflate por Jesper Larsson
  • Archivos Zip: Historia, explicación e implementación : un recorrido por una implementación de Deflate.