алгоритм сжатия JavaScript, который поддерживает двоичные данные? - PullRequest
5 голосов
/ 29 марта 2012

Я ищу алгоритм сжатия без потерь (например, LZW, Хаффмана или что-то еще) в javascript, который принимает и возвращает необработанные двоичные данные.

Под «двоичными данными» я подразумеваю последовательность байтов,которая может иметь любую из следующих форм:

  • строка, содержащая символы с любым значением от 0 до 255
  • массив, содержащий целые числа с любым значением от 0 до 255
  • строка, содержащая шестнадцатеричное представление данных (то есть 2 шестнадцатеричные цифры на байт)
  • строка, содержащая закодированное в base64 представление данных
  • или что-либо еще, что может быть однозначно преобразованоот или до любого из вышеперечисленных

Теперь очевидно, что существует множество реализаций JavaScript, доступных повсеместно для широкого спектра алгоритмов.Однако ВСЕ, что я нахожу, кажется, делает сумасшедшие вещи, такие как:

  • , возвращающий массив, содержащий также значения> 255 (так, какова степень сжатия сейчас? Как я представляю это в байтах, или какя бы пошел о сохранении этого в файл, например?)

  • возиться с кодировкой символов в строках, преобразованием из / в Unicode или URL / HTML объектов или еще много чего (это BINARY, кодировка символов)здесь не применимо!)

  • возвращает другие представления, которые не подходят для двоичного хранения (т.е. не могут быть преобразованы в последовательность байтов)

Кто-нибудь знает о хорошей реализации сжатия (+ декомпрессии) JavaScript, которая подходит моему двоичному фетишу?

Ответы [ 2 ]

1 голос
/ 30 марта 2012

Я думаю, что я нашел то, что искал в конце концов: эта реализация deflate + inflate в javascript , похоже, работает со строками как байтовые последовательности.

0 голосов
/ 29 марта 2012

прежде всего создайте закрытие для удержания бинарных или шестнадцатеричных или десятичных флагов

function ASearch() { }
ASearch.Flag = {
    Front_Wheel_Drive: 0xF, Rear_Wheel_Drive: 0xF0, Four_Wheel_Drive: 0xF00,
    Auto: 0xFF, Manual: 0xFF00,
    Gas: 0xF, Diesel: 0xF0, Hybrid: 0xF00, Electrical: 0xF000,
    Two: 1, Three: 2, Four: 4, Five: 8, Six: 16, Eight: 32, Ten: 64, Twelve: 128
};

затем установите так

SetFlag = (function (e) {
   e = e.srcElement;
   $("#" + e.parentNode.name).val(e.checked ?
        $("#" + e.parentNode.name).val() | ASearch.Flag[e.id] :
        $("#" + e.parentNode.name).val() ^ ASearch.Flag[e.id]);
});

это пример для упакованных данных в 32-битном целом числе

есть четыре переменные ... я использовал их для 18 флагов ... это быстро и супер эффективно

например ...

int i = 0; //binary = 0000 0000 0000 0000

i = i | 255; //binary = 0000 0000 1111 1111

i = i ^ 255; //binary = 0000 0000 0000 0000

i = i | 0xFF00; //binary = 1111 1111 0000 0000

i = i | 255; //binary = 1111 1111 1111 1111

i = i ^ 0xFF00; //binary = 0000 0000 1111 1111
...