我是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位)所以我不能逐字节地执行字节。
如果我的解释有点模糊,我很抱歉,但希望它足够了。
答案 0 :(得分:3)
读取任意位数的一种简单方法是例如
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
};
}
你只需要使用你的buffer
并通过
var bitReader = bufferBitReader(buffer);
然后你可以通过调用
来读取任意数量的位bitReader.readBits(8);
bitReader.readBits(3);
bitReader.readBits(2);
...
您可以通过
测试是否已经读取了所有位bitReader.isEnd()
要确保的一点是预期的实际的位顺序......一些'位流'应该从最低有效位到最高有效位...这段代码期望与第一位相反read是第一个字节中最重要的...