gpt4 book ai didi

javascript - Node.js 和 64 位变体

转载 作者:太空宇宙 更新时间:2023-11-04 00:48:29 26 4
gpt4 key购买 nike

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

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

由于按位运算的 32 位限制,以及 JS 本身不执行 64 位整数这一事实,我目前无法在 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
}

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

关于javascript - Node.js 和 64 位变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33614078/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com