Добрый день всем вам, читателям и помощникам, Я хочу использовать функцию javascript, которую я недавно нашел, ее LZW, сжимающий строку ,буквенный словарь для javascript lzw compression, «only-use-these-chars» -string
function lzw_encode(s) {
var dict = {};
var data = (s + "").split("");
var out = [];
var currChar;
var phrase = data[0];
var code = 256;
for (var i=1; i<data.length; i++) {
currChar=data[i];
if (dict[phrase + currChar] != null) {
phrase += currChar;
}
else {
out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0));
dict[phrase + currChar] = code;
code++;
phrase=currChar;
}
}
out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0));
for (var i=0; i<out.length; i++) {
out[i] = String.fromCharCode(out[i]);
}
return out.join("");
}
Эта функция на самом деле работает очень хорошо, единственная проблема, ив получил то, что я хочу передать закодированную строку через WebSockets и без дополнительного кодирования (base64 например), но это не работает каждый раз. Иногда сжатая строка имеет символы, которые не могут быть переданы через веб-узлы, она выдает ошибку javascript, что строка имеет незаконные символы. Поэтому моя идея заключалась в том, чтобы использовать только приемлемые символы в процессе кодирования, такие как «белый список» символов, который следует использовать для сжатия. То, что я понял из кода , заключается в том, что он берет charCode некоторого числа, поэтому я мог бы просто создать свой собственный charCodeSet, но я действительно не знаю, как его реализовать, и если он будет работать.
- Q1: что я могу сделать, чтобы моя кодировка lzw использовала только символы строки, которую я определяю?
- Q2: как еще я мог «передать http/s» этим китайским, арабским и контрольным символами, которые веб-сайт не хочет передавать?
Кстати, это ошибка, которую Chrome бросает:
Websocket message contains invalid character(s).
Uncaught Error: SYNTAX_ERR: DOM Exception 12
Update1: хотя его может ПОЛЕЗНЫЕ если вы видите, функция декодирования Aswell
function lzw_decode(s) {
var dict = {};
var data = (s + "").split("");
var currChar = data[0];
var oldPhrase = currChar;
var out = [currChar];
var code = 256;
var phrase;
for (var i=1; i<data.length; i++) {
var currCode = data[i].charCodeAt(0);
if (currCode < 256) {
phrase = data[i];
}
else {
phrase = dict[currCode] ? dict[currCode] : (oldPhrase + currChar);
}
out.push(phrase);
currChar = phrase.charAt(0);
dict[code] = oldPhrase + currChar;
code++;
oldPhrase = phrase;
}
return out.join("");
}
здесь я должен был бы реализовать свою собственную кодировку также, я думаю? ..
я apreciate ваших советов и работать очень много, поэтому я использую LZW является простотой как функция и высокой степень сжатия , например, я получаю соотношение 50% меньших результирующих фрагментов изображения, я делаю это сжатие при загрузке изображения и на сервере i снова распаковываю, потому что в своем приложении я хочу дать возможность загружать сразу несколько изображений. делая компрессию, ускорило весь процесс и немного сглаживает все, я подсчитал, что до сих пор получаю сжатие времени. я не нашел «простого» для использования zlib javascript lib – beist87
прямо сейчас я использую сжатие huffman, но с huffman я просто могу сжать, как максимум 30%. вы думаете, что его общая плохая идея позволить клиенту сжимать что-то перед загрузкой? Я подумал, что его инновационный – beist87
http://nodejs.org/ предоставляет интерфейс Javascript zlib. –