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 File = "FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA" File = Split(File, " ") For 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 'zero-based MyOutput = MyOutput & File(i + 1) & " " Next j i = i + 1 'Adjust the pointer Case Else For j = 0 To Count 'zero-based MyOutput = MyOutput & File(i + j + 1) & " " Next j i = i + j 'Adjust the pointer End Select Next i Debug.Print MyOutput 'AA AA AA 80 00 2A AA AA AA AA 80 00 2A 22 AA AA AA AA AA AA AA AA AA AAEnd Sub
Та же реализация в JavaScript :
/** * Helper functions to create readable input and output * * Also, see this fiddle for interactive PackBits decoder: * https://jsfiddle.net/y13xkh65/3/ */function 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 unpack function * * @param {String} data * @return {String} */function unpackBits (data) { var output = '', i = 0; while (i < data.length) { var hex = data.charCodeAt(i); if (hex == 128) { // Do nothing, nop } else if (hex > 128) { // This is a repeated byte hex = 256 - hex; for (var j = 0; j <= hex; ++j) { output += data.charAt(i + 1); } ++i; } else { // These are literal bytes for (var j = 0; j <= hex; ++j) { output += data.charAt(i + j + 1); } i += j; } ++i; } return output;}var original = 'FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA', data = unpackBits(hex2str(original));// Output is: AA AA AA 80 00 2A AA AA AA AA 80 00 2A 22 AA AA AA AA AA AA AA AA AA AAconsole.log(str2hex(data));
Внешние ссылки
[ редактировать ]- Веб-страница Apple с описанием формата PackBits
- Алгоритм TIFF PackBits взят с сайта https://www.fileformat.info с разрешения Corion.net.
- Сжатие PACKBITS или почему мы поддерживаем метод сжатия TIFF без потерь? статья на сайте https://www.universal-document-converter.com также описывает алгоритм.