gpt4 book ai didi

javascript - 从二进制字符串中读取可变长度位

转载 作者:行者123 更新时间:2023-11-30 12:36:46 24 4
gpt4 key购买 nike

我是 javascript 和 node.js 的新手,我有一个 base64 编码的数据字符串,我需要从中解析多个具有不同位长度的值。

我想我应该先使用 Buffer 对象来读取 b64 字符串,但从那里我完全迷失了。

数据是一系列无符号整数,格式类似于:标题:

8 bits - uint  
3 bits - uint
2 bits - uint
3 bits - unused padding
6 bits - uint

之后是 23 位或 13 位数据的重复部分,每个部分都有几个我需要提取的字段。

23 位部分的示例:

3 bit - uint  
10 bit - uint
10 bit - uint

我的问题是,获取任意数量的位并将结果值放入单独的 uint 中的最佳方法是什么?请注意,有些值是多字节的(> 8 位),所以我不能逐字节地步进。

如果我的解释有点含糊,我深表歉意,但希望足够了。

最佳答案

读取任意数量位的一种简单方法是例如

function bufferBitReader(buffer) {
var bitPos = 0;

function readOneBit() {
var offset = Math.floor(bitPos / 8),
shift = 7 - bitPos % 8;
bitPos += 1;
return (buffer[offset] >> shift) & 1;
}

function readBits(n) {
var i, value = 0;
for (i = 0; i < n; i += 1) {
value = value << 1 | readOneBit();
}
return value;
}

function isEnd() {
return Math.floor(bitPos / 8) >= buffer.length;
}

return {
readOneBit: readOneBit,
readBits: readBits,
isEnd: isEnd
};
}

你只需使用你的 but buffer 并通过以下方式初始化阅读器

var bitReader = bufferBitReader(buffer);

然后你可以通过调用读取任意数量的位

bitReader.readBits(8);
bitReader.readBits(3);
bitReader.readBits(2);
...

您可以通过以下方式测试您是否已经读取了所有位

bitReader.isEnd()

要确保的一件事是预期的实际位顺序......一些“位流”应该从最低位到最高位..这段代码期望与你的第一位相反读取的是第一个字节中最重要的...

关于javascript - 从二进制字符串中读取可变长度位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25823344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com