Node.js NodeJS、basE91和&;小恩迪亚
如何使用NodeJS将下面的字符串从basE91解码为可读文本Node.js NodeJS、basE91和&;小恩迪亚,node.js,endianness,base91,Node.js,Endianness,Base91,如何使用NodeJS将下面的字符串从basE91解码为可读文本 8D7Hh-9D*.n-!DZrG-#DE-$DD-%DC-sl-tl-BEp2m-CE^Ul-DE}CH-EEE-FED-GEC-<l-=l-hE(.K-iEvqS-jEB-kEB-lEB-mEB-Rm-Sm-%E!{Q-&EDgN-(EG:K-)EE-*EE-+EB-xm-ym-GF{}U-HF()Q-IFt%D-JFE-KFB-LFD-[m-]m-mF;JG-nF7]Q-oF2-pFB-qFC-rFB-Wn-Xn
8D7Hh-9D*.n-!DZrG-#DE-$DD-%DC-sl-tl-BEp2m-CE^Ul-DE}CH-EEE-FED-GEC-<l-=l-hE(.K-iEvqS-jEB-kEB-lEB-mEB-Rm-Sm-%E!{Q-&EDgN-(EG:K-)EE-*EE-+EB-xm-ym-GF{}U-HF()Q-IFt%D-JFE-KFB-LFD-[m-]m-mF;JG-nF7]Q-oF2-pFB-qFC-rFB-Wn-Xn-+FD-,FE-.FB- FE-:FD-;FC-2n-3n-
然后我把它输入缓冲区
var buf = new Buffer(hex, 'hex');
console.log(buf.toString('utf8'));
这给了我:
VhUr►Ev?$a►3h?◄G‼V??f??v?q§►?▬►?f?↕P►?v?Hhi↕Vw&???♠??▬?va►?♦i@Fu►V?↑◄81♠if►v?if►??h! ?►??1#?8ih►7?♠?§?T▬??&??6?a ►?!►?↨☺#↕XW'♦♦↑↨7☺▬7htpiupfvph?►?1 ►?♣?G◄►p U??◄↨♣☺↕pf◄7♠q¶pf??►CphDpiFpfGpiXphYpgP◄♣◄►
我怎样才能把它变成我能用的东西?我怀疑这是一个JSON对象…简单的回答是在node.js中没有简单/快速的方法来实现这一点(显然目前也没有模块) 添加到@bryanmac的注释中,使用base91作为起点(主源文件只有160行,包括版权!),您可以将数据存储在node.js缓冲区中,一旦从base91转换为字节,就可以使用内置的node.js方法转换为字符串。非常紧凑。我认为这应该很容易翻译成JS
.您有两个非常独立的问题,在本次讨论中,这两个问题被合并在一起 如何使用Javascript/NodeJS/CommnJS解码basE91? 这就是你的问题,乍一看,你就知道了。答案似乎是:没有现成的解决方案,但basE91非常小且简单,您应该能够轻松地将其移植到JS 你的第二个不太明确的问题似乎是: 我如何对终极领主的游戏服务器通信协议进行反向工程? 您提到您的“basE91 LE”字符串来自MMO游戏服务器,并且几乎是“basE91 little endian”的唯一其他热门内容。(加上它看起来像你。)正如你所说的,你发布的数据不是普通的。BasE91使用了一组明确定义的字符,其中不包括“
-
”和“
”(空格),但它们都出现在数据中。您在评论中提到,您认为“-
”被用作分隔符,如果事先提供更多类似的信息,那么回答第二个问题会更容易
关于这个问题的一些说明:
- BasE91使用标准编码表。如果你正在制作一个在线游戏,并且想让你的流量有点混乱,那么使用一个不同的或混乱的表是很简单的。这可以解释数据中出现的非合法字符。另外,从那个论坛上可以看到一个完全不同的de/编码表。您是否尝试过使用该表手动解码部分数据,并查看其是否合理
- 您请求转换为“可读文本”,但basE91用于传输二进制数据,因此不清楚为什么要将其用于纯文本。即使假设它是编码文本,也有各种常见的方式来编码纯文本。更可能的情况是,数据是实际的二进制数据,在非常真实的意义上,basE91是文本表示。如果没有关于预期输出的更多信息,就很难知道如何将其翻译为文本。这是1像素透明gif的basE91编码:
可以转换成可读的文本吗?你提到你认为它是JSON,你能给我们一些提示说明你为什么这么想吗?(再说一遍,为什么要对纯文本使用二进制编码器?)JaQGWo*HBtAARDBtB"B"B"S|QtAAAA$M)Bc4v(#AsAAABtAACABtlBLHBtd
- 在同一个论坛帖子上工作,听起来你在使用一系列5位坐标,那么这些数字可能就是你想要的?然而,还有更多的谜题,因为这些basE91组编码不同大小的数字。即(难以理解的文字的警告墙):
echo'8D7Hh-9D*.n-!DZrG-#DE-$DD-%DC-sl-tl-BEp2m-CE^Ul DE}CH-EEE-FED-GEC-4d 01 57 84 “9D*.n”=>4e a1 3b 9f '!DZrG'=>4f 41 ec 19 #DE=>50 81 “$DD”=>51 61 “%DC”=>52 41 'sl'=>53 ‘tl’=>54 ‘BEp2m’=>6D61 6b 9a ‘CE^Ul’=>6e e1第94版 'DE}CH'=>6f c1 21 1c ‘EEE’=>70 81 “美联储”=>71 61 “GEC”=>72 41 '对于“如何使用Javascript/NodeJS/CommnJS解码basE91?” 我迁移到JavaScript中,目前支持
、String
和Buffer
。您可以试试: 首先我们需要一张桌子:Stream
const table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~"';
解码的核心部分是:
// `raw` is the input, asserted as `Buffer` const len = raw.length; let ret = ''; let n = 0; let b = 0; for (let i = 0; i < len; i++) { b |= raw[i] << n; n += 8; if (n > 13) { let v = b & 8191; if (v > 88) { b >>= 13; n -= 13; } else { v = b & 16383; b >>= 14; n -= 14; } ret += table[v % 91] + table[v / 91 | 0]; } } if (n) { ret += table[b % 91]; if (n > 7 || b > 90) ret += table[b / 91 | 0]; } return ret; // basE91 encoded string
// `raw` is the input, asserted as `String` const len = raw.length; const ret = []; let b = 0; let n = 0; let v = -1; for (let i = 0; i < len; i++) { const p = table.indexOf(raw[i]); if (p === -1) continue; if (v < 0) { v = p; } else { v += p * 91; b |= v << n; n += (v & 8191) > 88 ? 13 : 14; do { ret.push(b & 0xff); b >>= 8; n -= 8; } while (n > 7); v = -1; } } if (v > -1) { ret.push((b | v << n) & 0xff); } return Buffer.from(ret); // basE91 decoded Buffer
/`raw`是输入,断言为`String'` const len=原始长度; 常数ret=[]; 设b=0; 设n=0; 设v=-1; for(设i=0;i
>=8; n-=8; }而(n>7); v=-1; } } 如果(v>-1){
ret.push((b | v可能会让你开始:你确定这个字符串吗?使用bryanmac链接的参考解码器,我解码时没有得到任何看起来像可读文本的东西,只是高ascii垃圾。这个字符串肯定有问题。特别注意到“-”(破折号)不是编码字母表的一部分,但是文本中有很多破折号。(如果basE91与标记不兼容,那真是讽刺。)我相信破折号是用来分隔它的,就像一个空格字符。它是一个直接从MMO服务器复制的字符串。那里的论坛说它是BasE91编码的,是用来绘制世界地图的数据。@但是你的字符串不是有效的BasE91编码数据。BasE91字符串没有“-”在它们中。我仍然尝试使用原始basE91 cli(从源代码编译)对输入字符串进行解码和编码。解码器跳过字符,重新编码的字符串自然没有这些字符。解码的数据决不是utf-8/utf-16/// `raw` is the input, asserted as `Buffer` const len = raw.length; let ret = ''; let n = 0; let b = 0; for (let i = 0; i < len; i++) { b |= raw[i] << n; n += 8; if (n > 13) { let v = b & 8191; if (v > 88) { b >>= 13; n -= 13; } else { v = b & 16383; b >>= 14; n -= 14; } ret += table[v % 91] + table[v / 91 | 0]; } } if (n) { ret += table[b % 91]; if (n > 7 || b > 90) ret += table[b / 91 | 0]; } return ret; // basE91 encoded string
// `raw` is the input, asserted as `String` const len = raw.length; const ret = []; let b = 0; let n = 0; let v = -1; for (let i = 0; i < len; i++) { const p = table.indexOf(raw[i]); if (p === -1) continue; if (v < 0) { v = p; } else { v += p * 91; b |= v << n; n += (v & 8191) > 88 ? 13 : 14; do { ret.push(b & 0xff); b >>= 8; n -= 8; } while (n > 7); v = -1; } } if (v > -1) { ret.push((b | v << n) & 0xff); } return Buffer.from(ret); // basE91 decoded Buffer