[英]I don't understand how this code to “write an uint32 inside an array in javascript” works
因此,基本上,我拥有这段代码,可以在其他人的代码中找到它们,并且可以很好地完成我想做的事情,但是我想了解它是如何工作的。
我想知道与将uint32写入数组(例如使用Uint8Array并在Uint32Array缓冲区中写入内容或将DataView与setUint32一起使用)的区别不会产生相同的结果
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
然后删除刚编码的位,并继续使用该值的较高位。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.