从BitSet转换为字节数组

15

我选择了一个示例,它将BitSet转换为字节数组。

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;
}

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


链接http://www.exampledepot.com/egs/java.util/Bits2Array.html已过期,你还记得这个例子是什么吗? - Vishrant
4个回答

15
不,那没问题。对该帖子的评论是关于帖子中的其他代码部分,将其从字节数组转换为BitSet. 我会使用更多的空格,不过这只是我的偏好。
此外,这可能会导致比实际需要更长的数组。可以使用以下数组创建表达式:
byte[] bytes = new byte[(bits.length() + 7) / 8];

这样可以为所需的位数提供空间,但不能超过所需。基本上它相当于“除以8,但始终向上取整”。


10

如果由于大小端问题需要反转 BitSet,请更改以下内容:

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

更改为:

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


3

1
顺便说一下:官方名称是“Java 7”(就像自Java 5以来一样,但Java 5仍经常被称为Java 1.5。Java 6很少被称为Java 1.6)。 - Joachim Sauer
@Joachim Sauer,是的,官方名称是Java 7。我只是提到了版本号。无论如何,感谢您纠正我。 - Kamahire
3
谨慎使用 BitSet.toByteArray() 方法,因为它可能无法按照您期望的顺序序列化字节。BitSet notEqual = BitSet.valueOf(bitset.toByteArray()); // 这样做是不起作用的。 - Ryan

2
FYI,使用

bits.length()

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

java.util.BitSet -- set() doesn't work as expected


length 还有其他作用: BitSet bits = new BitSet(16); System.out.println("BITSET LEN=" + bits.size()); 输出结果为:BITSET LEN=64(我猜是使用的内存位数)。 - alwi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接