我不明白这段 "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
然后丢弃我们刚刚编码的位并继续使用值的较高位。
所以基本上我有这段代码,我在别人的代码中找到了它,并且可以很好地完成我想做的事情,但我想了解它是如何工作的。
我想知道将 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
然后丢弃我们刚刚编码的位并继续使用值的较高位。