从二进制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”预计会从最不重要的位到最重要的位…这个代码期望相反,你读的第一位是最重要的第一个字节…