javascript - 用于 javascript lzw 压缩的字母字典, "only-use-these-chars"-string

标签 javascript google-chrome compression syntax-error 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("");
}

这个函数实际上工作得很好,我遇到的唯一问题是我想通过 websockets 传输编码的字符串,而不需要额外的编码(例如 base64),但这并不每次都有效。有时,压缩字符串包含无法通过 websocket 传输的字符,它会抛出一个 javascript 错误,表明该字符串包含非法字符。所以我的想法是在编码过程中只使用可接受的字符,例如应该用于压缩的字符“白名单”。我从代码中理解了什么 是它采用某个数字的 charCode,所以我虽然可以创建自己的 charCodeSet,但我真的不知道如何实现它以及它是否可以工作。

  • 问题1:我该怎么做才能让我的 lzw 编码只使用我定义的字符串的字符?
  • 问题2:我怎样才能“http/s”传输这些websocket不想传输的中文、阿拉伯文和控制字符?

顺便说一句,这是 Chrome 抛出的错误:

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

在这里我还必须实现我的自定义字符集,我猜?..

最佳答案

确定可以发送和不能发送的字节。 (希望来自可靠的文档来源,而不是测试,而是通过测试进行验证。)

设计一个转义代码,使用其中一个有效字符作为转义字符,下一个字符(也是有效字符之一)对无法发送的字节进行编码。

将其应用于压缩机的输出。最好将压缩工作留给压缩器,而不是试图用编码来完成它。您应该将编码作为单独的步骤。

不要使用 LZW。与现代方法( zliblz4lzma 等)相比,它是无效且过时的

关于javascript - 用于 javascript lzw 压缩的字母字典, "only-use-these-chars"-string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15413153/

相关文章:

bash - 如何提取 .gz 文件的一部分(非开头)?

iphone - 如何跳过压缩一张 PNG?

Javascript正则表达式试图转义/**

javascript - 通过javascript设置iframe marginheight ="0"

css - 将 CSS 文件添加到 Chrome 扩展 list 不起作用

css - SVG CSS 过渡不适用于 `use` 元素 (Chrome)

c# - 解压缩 Gzip 字符串 C# Windows Phone 8

javascript - 将两个 div 并排对齐,然后将两个 div 水平和垂直居中

javascript - 是否可以使用nodejs/npm启动具有不同权限的js文件?

google-chrome - Dailymotion "broke"带有视频缩略图的 HTTPS(Chrome 警告)