2013-03-14 3 views
1

Добрый день всем вам, читателям и помощникам, Я хочу использовать функцию 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(""); 
} 

здесь я должен был бы реализовать свою собственную кодировку также, я думаю? ..

ответ

1

Определить, какие байты вы может и не может отправить. (Надеюсь, из надежного источника документации, в отличие от тестирования, но подтвержденного с тестированием.)

Создайте код выхода, в котором вы используете один из допустимых символов в качестве escape-символа, а также следующий символ, также один из допустимые символы, кодирует байт, который вы не можете отправить.

Примените это к выходу вашего компрессора. Лучше оставить работу сжатия компрессору, а не пытаться оседлать его с помощью кодирования. Вы должны кодировать как отдельный шаг.

Не используйте LZW. Это неэффективно и устаревшее по сравнению с современными методами (zlib, lz4, lzma и т.д.)

+0

я apreciate ваших советов и работать очень много, поэтому я использую LZW является простотой как функция и высокой степень сжатия , например, я получаю соотношение 50% меньших результирующих фрагментов изображения, я делаю это сжатие при загрузке изображения и на сервере i снова распаковываю, потому что в своем приложении я хочу дать возможность загружать сразу несколько изображений. делая компрессию, ускорило весь процесс и немного сглаживает все, я подсчитал, что до сих пор получаю сжатие времени. я не нашел «простого» для использования zlib javascript lib – beist87

+0

прямо сейчас я использую сжатие huffman, но с huffman я просто могу сжать, как максимум 30%. вы думаете, что его общая плохая идея позволить клиенту сжимать что-то перед загрузкой? Я подумал, что его инновационный – beist87

+0

http://nodejs.org/ предоставляет интерфейс Javascript zlib. –