Node.js和64位varints

时间:2015-11-09 16:50:24

标签: javascript node.js

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

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

由于按位操作的32位限制,以及JS本身不做64位的事实,我目前无法在Javascript中解析这个问题。有没有人对如何做到这一点有任何建议?

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

我以为我可以使用node-bignum来表示数字,但我不确定如何将包含varint字节的Buffer转换为此数据。

干杯, 森

1 个答案:

答案 0 :(得分:1)

简单地使用现有的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
}

使用它与使用原始解码模块完全相同。