我不明白这段代码如何"write an uint32 inside an array in javascript"工作



所以基本上我有这段代码,我已经在别人的代码中找到了,并且对于我正在尝试做的事情工作得很好,但我想了解它是如何工作的。

我想知道它与将 uint32 写入数组(如使用 Uint8Array 并在 Uint32Array 缓冲区内写入(或使用带有 setUint32 的 DataView 有何不同,不会给出相同的结果

function writeUint32(message, value){
    while(true){
        if((value & -128) === 0){
            message.push(value)
            return
        }
        else {
            message.push(value & 127 | 128)
            value >>>= 7
        }
    }
}

不同之处在于此函数以可变长度格式写入值,每个字节使用 7 位数据和 1 位来指示更多数据,以小端顺序(第一个字节包含低阶位(。这被称为LEB128。 DataView 上的setUint32只是将位直接复制到底层数组,而无需花哨的编码。LEB128(或其他可变长度编码(可用于节省空间(如果编码值通常不高(,但编码和解码需要一些额外的工作。

为了解释代码,

(value & -128) === 0

这将检查前 25 位是否全部为零,如果为,则当前值适合 7 位块,这将是最后一个块(未设置"继续"标志(。

value & 127 | 128

这会从值中获取最低有效 7 位,然后在生成的块上设置"继续"标志。

value >>>= 7

然后删除我们刚刚编码的位,并继续使用值的较高位。

相关内容

最新更新