PackBits

Compartir Imprimir Citar

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 se puede utilizar en archivos TIFF. Los archivos TGA también usan este esquema de compresión RLE, pero tratan el flujo de datos como píxeles en lugar de bytes.

Un flujo de datos de 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 del encabezado como un entero con signo.

Header byteDatos posteriores al byte del encabezado
0 a 127(1 + n) bytes literales de datos
−1 a 127Un byte de datos, repetidos (1 − n) veces en la salida descomprimida
−128No hay operación (desliza y trata 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 generalmente se escriben como datos literales. No hay forma basada en los datos de PackBits para determinar el final del flujo de datos; es decir, uno ya debe saber el tamaño de los datos comprimidos o sin comprimir antes de leer un flujo de datos de 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:

Subsidio UnpackBitsDemo() Dim Archivo As Variante Dim MyOutput As String Dim Conde As Largo Dim i As Largo, j As Largo  Archivo = "FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA" Archivo = Split()Archivo, ")  Para i = LBound()Archivo) A UBound()Archivo) Conde = Aplicación.WorkheetFunction.Hex2Dec()Archivo()i) Seleccione Caso Conde Caso I >= 128 Conde = 256 - Conde Dos Complementos Para j = 0 A Conde 'Con base cero' MyOutput = MyOutput " Archivo()i + 1) " " Siguiente j i = i + 1 ' Ajuste el puntero Caso Else Para j = 0 A Conde 'Con base cero' MyOutput = MyOutput " Archivo()i + j + 1) " " Siguiente j i = i + j ' Ajuste el puntero Final Seleccione Siguiente i Debug.Imprimir MyOutput AA AA 80 00 2A AA AA AA AA AA 80 00 2A 22 AA AA AA AA AA AA AA AA AA AA AA AA AA AAFinal Subsidio

La misma implementación en JavaScript:

* * Funciones de ayuda para crear entrada y salida legibles *  * También, vea este fiddle para el decodificador interactivo de PackBits: * https://jsfiddle.net/y13xkh65/3/ */función str2hex ()str) {} retorno str.división()' ').mapa()función ()char) {} Var valor = char.charCodeAt()0); retorno ()valor . 16 ? '0' : ' ') + valor.toString()16)).toUpperCase(); }).Únase()');}función hex2str ()Hex) {} retorno Hex.división()').mapa()función ()cuerda) {} retorno String.deCharCode()parseInt()cuerda, 16)); }).Únase()' ');}* * Función de desempaquetado de PackBits *  * @param {String} data * @return {String} */función unpackBits ()datos) {} Var Producto = ' ', i = 0; mientras ()i . datos.longitud) {} Var Hex = datos.charCodeAt()i); si ()Hex == 128) {} // No hagas nada, nop } más si ()Hex  128) {} // Este es un byte repetido Hex = 256 - Hex; para ()Var j = 0; j . Hex; ++j) {} Producto += datos.charAt()i + 1); } ++i; } más {} // Estos son bytes literales para ()Var j = 0; j . Hex; ++j) {} Producto += datos.charAt()i + j + 1); } i += j; } ++i; } retorno Producto;}Var original = 'FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA', datos = 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 AA AA AAconsola.log()str2hex()datos));