我正在编写一个基于Node.js的应用程序,该应用程序通过TCP与基于C ++的服务器通信。服务器使用二进制协议,与协议缓冲区非常相似,但不完全相同。

服务器返回的一种数据类型是无符号的64位整数(uint64_t),它被序列化为varint,其中最高有效位用于指示下一个字节是否也是int的一部分。

由于对按位操作的32位限制,以及JS本身不执行64位int的事实,我目前无法在Javascript中进行解析。有人对我该怎么做有什么建议吗?

我的varint阅读代码与此处显示的代码非常相似:https://github.com/chrisdickinson/varint/blob/master/decode.js

我以为可以用node-bignum表示数字,但是我不确定如何将由varint字节组成的Buffer转换为数字。

干杯,
内森

最佳答案

只需采用现有的varint读取模块并将其修改为产生Bignum对象而不是常规数字即可:

Bignum = require('bignum');
module.exports = read;

var MSB = 0x80
    , REST = 0x7F;

function read(buf, offset) {
    var res    = Bignum(0)
        , offset = offset || 0
        , counter = offset
        , b
        , shift  = 0
        , l = buf.length;

    do {
        if(counter >= l) {
            read.bytesRead = 0;
            return undefined
        }
        b = buf[counter++];
        res = res.add(Bignum(b & REST).shiftLeft(shift));
        shift += 7
    } while (b >= MSB);

    read.bytes = counter - offset;

    return res
}


使用它的方式与使用原始解码模块时完全相同。

10-08 06:33