Jump to content

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));
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: e0e376c80f5915cbc5acfb72d14ff629__1712296080
URL1:https://arc.ask3.ru/arc/aa/e0/29/e0e376c80f5915cbc5acfb72d14ff629.html
Заголовок, (Title) документа по адресу, URL1:
PackBits - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)