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

时间:2014-09-13 12:40:48

标签: javascript node.js byte bit-manipulation

我是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位)所以我不能逐字节地执行字节。

如果我的解释有点模糊,我很抱歉,但希望它足够了。

1 个答案:

答案 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是第一个字节中最重要的...