1

読者とヘルパーの皆さん、こんにちは。最近見つけた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など)なしで転送したいのですが、毎回機能するわけではありません。圧縮された文字列にWebSocket経由で転送できない文字が含まれている場合があり、文字列に不正な文字が含まれているというjavascriptエラーがスローされます。したがって、私の考えは、圧縮に使用する必要がある文字の「ホワイトリスト」のように、エンコードプロセスで受け入れ可能な文字のみを使用することでした。私がコードから理解したことは、それがいくつかの数のcharCodeを取得することです。したがって、私は自分のcharCodeSetを作成することはできましたが、それを実装する方法と、それが機能するかどうかさえ本当にわかりません。

  • Q1:lzwエンコーディングで定義した文字列の文字を使用するために何ができますか?
  • Q2:WebSocketが転送したくないこれらの中国語、アラビア語、および制御文字を「http / s」で転送するには、他にどのような方法がありますか?

ちなみに、これはChromeがスローしているエラーです:

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

Update1:​​ただし、デコード機能も表示されている場合は役立つ可能性があります

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

ここでは、カスタム文字セットも実装する必要があると思いますか?..

4

1 に答える 1

1

送信できるバイトと送信できないバイトを決定します。(うまくいけば、テストではなく、信頼できるドキュメントのソースからですが、テストで検証されています。)

有効な文字の1つをエスケープ文字として使用し、次の文字(これも有効な文字の1つ)が送信できないバイトをエンコードするエスケープコードを設計します。

それをコンプレッサーの出力に適用します。圧縮の仕事はコンプレッサーに任せて、エンコードでサドルしようとしないのが最善です。別のステップとしてエンコードする必要があります。

LZWは使用しないでください。最新の方法(zliblz4lzmaなど)と比較すると、効果がなく、廃止されています。

于 2013-03-14T21:46:23.423 に答える