我正在编写基于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转换为此数据。
干杯, 森
答案 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
}
使用它与使用原始解码模块完全相同。