Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 缓冲区到整数。理解这行代码有困难吗_Javascript_Node.js - Fatal编程技术网

Javascript 缓冲区到整数。理解这行代码有困难吗

Javascript 缓冲区到整数。理解这行代码有困难吗,javascript,node.js,Javascript,Node.js,我正在寻找帮助,了解npm模式 此模块的目的是作为一个函数,通过传递的第二个参数返回输入mod的sha-1哈希 这个模块中我不理解的具体函数是一个以缓冲区作为输入并返回整数的函数: var toNumber = function (buf) { return buf.readUInt16BE(0) * 0xffffffff + buf.readUInt32BE(2) } 我似乎不明白为什么要选择缓冲区的那些特定偏移量,以及乘以0xffffff的目的是什么 这个模块对我来说真的很有趣,如果能

我正在寻找帮助,了解npm模式

此模块的目的是作为一个函数,通过传递的第二个参数返回输入mod的sha-1哈希

这个模块中我不理解的具体函数是一个以缓冲区作为输入并返回整数的函数:

var toNumber = function (buf) {
  return buf.readUInt16BE(0) * 0xffffffff + buf.readUInt32BE(2)
}
我似乎不明白为什么要选择缓冲区的那些特定偏移量,以及乘以
0xffffff
的目的是什么


这个模块对我来说真的很有趣,如果能帮助我理解如何将缓冲区转换为整数,我将不胜感激

乘以2相当于将位向左移动1,因此乘以2^16的目的相当于将位向左移动16次

这里已经回答了一个类似的问题:

它打印缓冲区中的第一个UINT32(无符号整数32位)

首先,它使用Big-Endian读取缓冲区的前两个字节(UINT16),然后将其乘以0xffffff

然后,它读取缓冲区中的第二个四字节(UINT32),并将其添加到相乘的数字中,从而得到一个由缓冲区的前6个字节构成的数字

例子:考虑[缓冲区BBAAA CC CC DD…] < /P>

0xbb * 0xffffffff = 0xbaffffff45
0xbaffffff45 + 0xaaccccdd = 0xbbaacccc22
关于偏移量,它选择了这样的方式:

第一次,它从字节0读取到字节1(转换为类型-UINT16)

第二次,它从字节2读取到字节5(转换为类型-UINT32)

总之,它使用big-endian表示法从缓冲区的前6个字节构造一个数字,并将其返回给调用函数

希望这能回答你的问题

编辑

正如有人在评论中指出的那样,我完全错误地认为0xFFFFFF是32的左移位,它只是一个数字乘法——我假设这是某种内部协议,用于计算符合他们期望的正确合法缓冲区头

编辑2

在原始上下文中查看函数后,我得出以下结论:

此函数是哈希流的一部分,其工作方式如下:

主流接收字符串输入和哈希输出的最大值,然后接受字符串输入,将其插入SHA-1哈希函数

SHA-1哈希返回一个缓冲区,它获取该缓冲区,并对其应用哈希索引,如以下代码摘录所示:

return toNumber(crypto.createHash('sha1').update(input).digest()) % max

此外,它还使用一个模来确保返回的哈希索引不超过可能的最大哈希。

不是
0xFFFFFFFF
32位吗?确实是。原始问题中的变量只有16位宽,但左移16位等于乘以
0x10000
。我在这里遗漏了什么?很好,我完全搞糊涂了-在这一点上,我只能假设它们的一些内部协议来生成数字-可能是一个校验和数字或类似的东西?也许它会更有意义,因为
(这不是实现这个数字的一种方法,但问题是,这个数字背后的实际含义是什么?这只能在更广泛的程序环境中得到回答(即,查看使用此函数的流程)好的,这只是我的理论,但是如果缓冲区内容被求和成6字节块并写入同一个缓冲区,你可以通过从缓冲区的总和中减去它们来避免计算总和字节(前6个字节)。也许它们是移位和减法的组合?