祝所有读者和帮助者美好的一天, 我想利用我最近发现的一个 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("");
}
在这里我还必须实现我的自定义字符集,我猜?..
最佳答案
确定可以发送和不能发送的字节。 (希望来自可靠的文档来源,而不是测试,而是通过测试进行验证。)
设计一个转义代码,使用其中一个有效字符作为转义字符,下一个字符(也是有效字符之一)对无法发送的字节进行编码。
将其应用于压缩机的输出。最好将压缩工作留给压缩器,而不是试图用编码来完成它。您应该将编码作为单独的步骤。
关于javascript - 用于 javascript lzw 压缩的字母字典, "only-use-these-chars"-string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15413153/