从二进制string读取可变长度位
即时通讯新的javascript和node.js,我有一个base64编码的数据string,我需要parsing几个不同长度的值。
我想我会开始使用Buffer对象来读取b64string,但从那里我完全丢失。
数据是一系列无符号整数,格式与此类似:头文件:
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 }; }
你只是拿你的buffer
并初始化读者
var bitReader = bufferBitReader(buffer);
然后你可以通过调用来读取任意数量的位
bitReader.readBits(8); bitReader.readBits(3); bitReader.readBits(2); ...
你可以testing你是否已经阅读所有的位
bitReader.isEnd()
有一点要确定的是预期的位的实际顺序…一些“位stream”预计会从最不重要的位到最重要的位…这个代码期望相反,你读的第一位是最重要的第一个字节…