14

我选择了这个将 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;
}

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

4

4 回答 4

15

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

这也可能导致一个比它需要的更长的数组。数组创建表达式可以是:

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

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

于 2011-06-01T07:02:40.870 回答
10

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

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

到:

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

于 2012-12-14T11:24:40.773 回答
3

这对我来说很好。如果您使用的是 Java 1.7,那么它有方法toByteArray()

于 2011-06-01T07:13:43.390 回答
1

仅供参考,使用

bits.length()

获取 bitset 的大小可能会返回不正确的结果;我不得不修改原始示例以利用 size() 方法来获取定义的位集大小(而 length() 返回设置的位数)。有关更多信息,请参阅下面的线程。

java.util.BitSet -- set() 没有按预期工作

于 2015-01-20T19:57:33.790 回答