从位集数组转换为字节数组

2022-09-03 18:20:01

我拿起了这个例子,它将BitSet转换为Byte数组。

public static byte[] toByteArray(BitSet bits) {
    byte[] bytes = new byte[bits.length()/8+1];
    for (int i=0; i<bits.length(); i++) {
        if (bits.get(i)) {
            bytes[bytes.length-i/8-1] |= 1<<(i%8);
        }
    }
    return bytes;
}

但是在讨论论坛中,我看到通过这种方法我们不会获得所有位,因为我们每次计算将失去一位。这是真的吗?我们是否需要修改上述方法?


答案 1

不,没关系。对帖子的评论与帖子中的一段代码有关,从字节数组转换为.诚然,我会使用更多的空格。BitSet

此外,这也可能最终得到一个比它需要的更长的数组。数组创建表达式可以是:

byte[] bytes = new byte[(bits.length() + 7) / 8];

这为需要的位提供了空间,但仅此而已。基本上,它相当于“除以8,但总是向上舍入”。


答案 2

如果由于字节序问题而需要按相反顺序排列的 BitSet,请更改:

bytes[bytes.length-i/8-1] |= 1<<(i%8);

自:

字节[i/8] |= 1<<(7-i%8);


推荐