PackBits

PackBits — это быстрая и простая схема сжатия без потерь для кодирования данных по длинам серий .

Apple представила формат PackBits с выпуском MacPaint на компьютере Macintosh . Эта схема сжатия может использоваться в файлах TIFF . Файлы TGA также используют эту схему сжатия RLE, но обрабатывают поток данных как пиксели, а не байты. Сжатие Packbit также использовалось в файлах ILBM .

Поток данных 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 Файл = "FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA " Файл = Разделить ( Файл , " " ) Для i = LBound ( Файл ) Для UBound ( Файл ) Количество = Приложение.ФункцияРабочегоЛиста . Hex2Dec ( File ( i )) Select Case Count Case Is >= 128 Count = 256 - Count 'Дополнение до двух 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 End Sub   

Та же реализация на JavaScript :

/** * Вспомогательные функции для создания читаемого ввода и вывода * * Также см. эту скрипку для интерактивного декодера PackBits: * https://jsfiddle.net/y13xkh65/3/ */функция str2hex ( str ) { return str . split ( '' ). map ( function ( char ) { var value = char . charCodeAt ( 0 );            return (( value < 16 ? '0' : '' ) + value . toString ( 16 )). toUpperCase (); }). join ( ' ' ); }          function hex2str ( hex ) { return hex.split ( '' ). map ( function ( string ) { return String.fromCharCode ( parseInt ( string , 16 ) ); } ) . join ( ' ' ); }           /** * Функция распаковки PackBits * * @param {String} data * @return {String} */ function unpackBits ( data ) { var output = '' , i = 0 ;           while ( i < data.length ) { var hex = data.charCodeAt ( i ) ;         if ( hex == 128 ) { // Ничего не делать, nop } else if ( hex > 128 ) { // Это повторяющийся байт hex = 256 - hex ;                   для ( var j = 0 ; j <= hex ; ++ j ) { output += data . charAt ( i + 1 ); }                ++ i ; } else { // Это литеральные байты for ( var j = 0 ; j <= hex ; ++ j ) { output += data . charAt ( i + j + 1 ); }                       я += j ; }    ++ я ; ​​}  возврат вывода ; } 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 AA console . журнал ( str2hex ( данные ));
  • Веб-страница Apple с описанием формата PackBits
  • Алгоритм TIFF PackBits взят с сайта https://www.fileformat.info с разрешения Corion.net
  • Сжатие PACKBITS или почему мы поддерживаем метод сжатия TIFF без потерь? в статье на сайте https://www.universal-document-converter.com также описан алгоритм.
Взято с "https://en.wikipedia.org/w/index.php?title=PackBits&oldid=1217347610"