PackBits - это быстрая и простая схема сжатия без потерь для длинномерного кодирования данных.
Apple представила формат PackBits с выпуском MacPaint на компьютере Macintosh . Эта схема сжатия является одним из типов сжатия, которое можно использовать в файлах TIFF . TGA- файлы также используют эту схему сжатия RLE, но обрабатывают поток данных как пиксели, а не байты.
Поток данных PackBits состоит из пакетов с однобайтовым заголовком, за которым следуют данные. Заголовок - это байт со знаком; данные могут быть подписанными, неподписанными или упакованными (например, пиксели MacPaint).
В следующей таблице n - значение байта заголовка в виде целого числа со знаком.
Байт заголовка | Данные после байта заголовка |
---|---|
От 0 до 127 | (1 + n ) буквальных байтов данных |
От −1 до −127 | Один байт данных, повторяющийся (1 - n ) раз в распакованном виде |
−128 | Нет операции (пропускать и рассматривать следующий байт как байт заголовка) |
Обратите внимание, что интерпретация 0 как положительного или отрицательного значения не влияет на результат. Выполнения двух байтов, смежных с невыполнениями, обычно записываются как буквальные данные. На основе данных PackBits невозможно определить конец потока данных; другими словами, нужно знать размер сжатых или несжатых данных перед чтением потока данных PackBits, чтобы знать, где он заканчивается.
Apple Computer (см. Внешнюю ссылку) предоставляет этот короткий пример упакованных данных: FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA
Следующий код, написанный на Microsoft VBA, распаковывает данные:
Sub UnpackBitsDemo () Dim File As Variant Dim MyOutput As String Dim Count As Long Dim i As Long , j As Long File = "FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA" File = Split ( File , "" ) Для i = LBound ( File ) To UBound ( File ) Count = Application . WorksheetFunction . Hex2Dec ( File ( i )) Select Case Count Case Is > = 128 Count = 256 - Count 'Two's Complement For j = 0 To Count ' отсчитываемый от нуля MyOutput = MyOutput & File ( i + 1 ) & "" Next j i = i + 1 'Настроить указатель Case Else For j = 0 To Count ' отсчитывать от нуля MyOutput = MyOutput & File ( i + j + 1 ) & "" Next j i = i + j 'Настроить указатель End Select Next i Отладка . Печать 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 Конечный переходник
Та же реализация в JS:
/ ** * Вспомогательные функции для создания удобочитаемого ввода и вывода * * См. Также эту скрипку для интерактивного декодера PackBits: * https://jsfiddle.net/volter9/tj04ejdt/ * /функция str2hex ( str ) { return str . сплит ( '' ). отображение ( функция ( символ ) { вар значение = символ . charCodeAt ( 0 ); return (( значение < 16 ? '0' : '' ) + значение . toString ( 16 )). toUpperCase (); }). присоединиться ( '' ); }функция hex2str ( шестнадцатеричный ) { вернуть шестнадцатеричный . сплит ( '' ). карта ( функция ( строка ) { вернуть строку . fromCharCode ( parseInt ( строка , 16 )); }). присоединиться ( '' ); }/ ** * PackBits функция распаковки * * @param {String} data * @return {String} * / function unpackBits ( data ) { var output = '' , i = 0 ; while ( i < data . length ) { var hex = data . charCodeAt ( i ); если ( шестнадцатеричный > = 128 ) { шестнадцатеричный = 256 - шестнадцатеричный ; for ( var j = 0 ; j <= hex ; ++ j ) { output + = data . charAt ( я + 1 ); } ++ i ; } else { for ( var j = 0 ; j <= hex ; ++ j ) { output + = data . charAt ( i + j + 1 ); } я + = j ; } ++ i ; } возвратный вывод ; }var original = 'FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA' , data = unpackBits ( hex2str ( original ));// Вывод: AA AA AA 80 00 2A AA AA AA AA 80 00 2A 22 AA AA AA AA AA AA AA AA AA Консоль . журнал ( str2hex ( данные ));
Внешние ссылки
- Веб-страница Apple с описанием формата PackBits
- Алгоритм TIFF PackBits взят с сайта https://www.fileformat.info с разрешения Corion.net.
- Сжатие PACKBITS или почему мы поддерживаем метод сжатия TIFF без потерь? статья на сайте https://www.universal-document-converter.com также описывает алгоритм.