Node.js 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

如何使用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-+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编码:

    JaQGWo*HBtAARDBtB"B"B"S|QtAAAA$M)Bc4v(#AsAAABtAACABtlBLHBtd
    
    可以转换成可读的文本吗?你提到你认为它是JSON,你能给我们一些提示说明你为什么这么想吗?(再说一遍,为什么要对纯文本使用二进制编码器?)

  • 在同一个论坛帖子上工作,听起来你在使用一系列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