PackBits es un esquema de compresión sin pérdidas rápido y simple para la codificación de datos de longitud de ejecución .
Apple introdujo el formato PackBits con el lanzamiento de MacPaint en la computadora Macintosh . Este esquema de compresión es uno de los tipos de compresión que se pueden utilizar en archivos TIFF . Los archivos TGA también utilizan este esquema de compresión RLE, pero tratan el flujo de datos como píxeles en lugar de bytes.
Un flujo de datos PackBits consta de paquetes con un encabezado de un byte seguido de datos. El encabezado es un byte firmado; los datos pueden estar firmados, sin firmar o empaquetados (como los píxeles de MacPaint).
En la siguiente tabla, n es el valor del byte de encabezado como un entero con signo.
Byte de encabezado | Datos que siguen al byte del encabezado |
---|---|
0 hasta 127 | (1 + n ) bytes literales de datos |
−1 a −127 | Un byte de datos, repetido (1 - n ) veces en la salida descomprimida |
−128 | Sin operación (omitir y tratar el siguiente byte como un byte de encabezado) |
Tenga en cuenta que interpretar 0 como positivo o negativo no hace ninguna diferencia en la salida. Las ejecuciones de dos bytes adyacentes a las no ejecuciones se escriben normalmente como datos literales. No hay forma basada en los datos de PackBits para determinar el final del flujo de datos; es decir, uno debe saber ya el tamaño de los datos comprimidos o descomprimidos antes de leer un flujo de datos PackBits para saber dónde termina.
Apple Computer (consulte el enlace externo) proporciona este breve ejemplo de datos empaquetados: FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA
El siguiente código, escrito en Microsoft VBA, descomprime los datos:
Sub UnpackBitsDemo () Dim Archivo como variante Dim MyOutput como cadena Dim Count As Long Dim i As Long , j As Long Archivo = "FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA" Archivo = Dividir ( Archivo , "" ) Para i = LBound ( archivo ) a UBound ( archivo ) Count = Application . WorksheetFunction . HEX2DEC ( Archivo ( i )) Seleccionar la caja Contar Case Is > = 128 Count = 256 - Conde 'del complemento a dos para j = 0 Para Count ' base cero myOutput = myOutput y Archivo ( i + 1 ) y "" Siguiente j i = i + 1 'Ajuste el indicador Case Else Para j = 0 Para Count ' base cero myOutput = myOutput y archivo ( i + j + 1 ) y "" Siguiente j i = i + j 'Ajuste el indicador Fin Seleccione Siguiente i Depurar . Imprimir MyOutput 'AA AA AA 80 00 2A AA AA AA AA 80 00 2A 22 AA AA AA AA AA AA AA AA AA AA Fin Sub
La misma implementación en JS:
/ ** * Funciones auxiliares para crear entradas y salidas legibles * * También, vea este violín para el decodificador interactivo PackBits: * https://jsfiddle.net/volter9/tj04ejdt/ * /function str2hex ( str ) { return str . dividir ( '' ). mapa ( función ( carácter ) { valor var = carácter . charCodeAt ( 0 ); return (( valor < 16 ? '0' : '' ) + valor . toString ( 16 )). toUpperCase (); }). unirse ( '' ); }function hex2str ( hex ) { return hex . dividir ( '' ). map ( function ( string ) { return String . fromCharCode ( parseInt ( string , 16 )); }). unirse ( '' ); }/ ** * Función de descomprimir PackBits * * @param {String} datos * @return {String} * / function unpackBits ( data ) { var output = '' , i = 0 ; while ( i < data . length ) { var hex = data . charCodeAt ( i ); si ( hexadecimal > = 128 ) { hexadecimal = 256 - hexadecimal ; para ( var j = 0 ; j <= hex ; ++ j ) { salida + = datos . charAt ( i + 1 ); } ++ i ; } else { for ( var j = 0 ; j <= hex ; ++ j ) { salida + = datos . charAt ( i + j + 1 ); } i + = j ; } ++ i ; } salida de retorno ; }var original = 'FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA' , data = unpackBits ( hex2str ( original ));// La salida es: AA AA AA 80 00 2A AA AA AA AA 80 00 2A 22 AA AA AA AA AA AA AA AA AA AA consola . log ( str2hex ( datos ));
enlaces externos
- Página web de Apple que describe el formato PackBits
- El algoritmo TIFF PackBits tomado del sitio https://www.fileformat.info con permiso de Corion.net
- ¿Compresión de PACKBITS o por qué apoyamos el método de compresión TIFF sin pérdidas? el artículo del sitio https://www.universal-document-converter.com también describe el algoritmo.