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

I don't understand how this code to "write an uint32 inside an array in javascript" works

所以基本上我有这段代码,我在别人的代码中找到了它,并且可以很好地完成我想做的事情,但我想了解它是如何工作的。

我想知道将 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(或其他可变长度编码)可用于保存 space(如果编码值通常不高)但需要花费一些额外的编码和解码工作。

解释代码,

(value & -128) === 0

这会检查前 25 位是否全为零,如果是,则当前值适合 7 位块,这将是最终块(未设置 "continue" 标志)。

value & 127 | 128

这从值中取出最低有效的 7 位,然后在结果块上设置 "continue" 标志。

value >>>= 7

然后丢弃我们刚刚编码的位并继续使用值的较高位。