我正在编写一个基于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
}
使用它的方式与使用原始解码模块时完全相同。