2013-03-14 3 views
1

독자 여러분, 안녕하세요. 나는 최근에 발견 한 자바 스크립트 함수를 사용하고 싶습니다. LZW는 문자열을 압축합니다. . 이 기능은 실제로 매우 잘 작동javascript lzw 압축 용 문자 사전

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(""); 
} 

, 유일한 문제 필자가있어 내가 때마다 WebSocket을 통해 추가적인 인코딩 (Base64로 예를 들면)하지만 나던 작업없이 인코딩 된 문자열을 전송하려는 것입니다. 때때로 압축 된 문자열에 웹 소켓을 통해 전송 될 수없는 문자가있는 경우 문자열에 잘못된 문자가있는 자바 스크립트 오류가 발생합니다. 그래서 제 생각은 압축을 위해 사용 되어야만하는 "화이트리스트 (whitelist)"와 같은 인코딩 과정에서 허용되는 문자만을 사용하는 것이 었습니다. 내가 코드 에서 이해 한 것은 그 숫자의 charCode를 취하는 것입니다. 그래서 저는 제 자신의 charCodeSet을 만들 수는 있지만 실제로 구현하는 방법과 그것이 작동하는지조차 모릅니다.

  • Q1 : 내 lzw 인코딩은 정의한 문자열의 문자 만 사용합니다.
  • Q2 : websocket이 전송하고 싶지 않은이 중국어, 아랍어 및 제어 문자를 어떻게 "http/s"전송할 수 있습니까?

    Websocket message contains invalid character(s). 
    Uncaught Error: SYNTAX_ERR: DOM Exception 12 
    

    갱신 1 : 그런데

,이 크롬 던지고 오류가 당신이 디코딩 기능이 여기

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(""); 
} 

를 aswell 보면 그것의 helpfull 수 있지만 내가 내 사용자 정의 charset도 구현해야할까요? ...

답변

1

할 수 있고 보낼 수 없다. (테스트와는 달리 신뢰할 수있는 문서 소스에서 얻으려는 것이지만 테스트를 통해 확인하십시오.)

유효 문자 중 하나를 이스케이프 문자로 사용하고 다음 문자와 함께 유효한 이스케이프 코드를 디자인하십시오. 유효한 문자는 보낼 수없는 바이트를 인코딩합니다.

압축기의 출력에 적용하십시오. 압축 작업을 압축기에 맡기고 인코딩으로 안장에 넣지 않는 것이 가장 좋습니다. 별도의 단계로 인코딩해야합니다.

LZW를 사용하지 마십시오. 그것은 현대적인 방법 (zlib, lz4, lzma 등)

+0

내가 조언을 뵙죠 매우 많은 일을, 난 LZW를 사용하여 한 이유는 기능과 높은 압축률과 단순함에 비해 효과 및 사용되지 않습니다 50 % 더 작은 결과 이미지 덩어리의 비율에 도달하는 것처럼, 나는이 압축을 이미지 업로드와 서버 측에서 다시 압축을 풉니 다. 왜냐하면 내 응용 프로그램에서는 다양한 이미지를 한 번에 업로드 할 수있는 가능성을 부여하기 때문입니다. 압축을 수행하면 전체 프로세스가 빨라지고 모든 작업이 조금 원활 해 지므로 이전에 압축하여 시간을 업로드하는 것으로 계산됩니다. 나는 zlib 자바 스크립트 lib – beist87

+0

을 사용하는 "단순한"것을 찾지 못했지만 지금은 huffman 압축을 사용하고 있지만 huffman은 단지 최대 30 %를 압축 할 수 있습니다. 전반적으로 클라이언트가 업로드하기 전에 무언가를 압축하도록하는 것이 좋지 않습니까? 나는 혁신적인 종류의 – beist87

+0

http://nodejs.org/가 자바 스크립트 zlib 인터페이스를 제공한다고 생각했습니다. –

관련 문제