从 BitSet 转换为 Byte 数组

Posted

技术标签:

【中文标题】从 BitSet 转换为 Byte 数组【英文标题】:Converting from BitSet to Byte array 【发布时间】:2011-09-06 01:06:44 【问题描述】:

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

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

【问题讨论】:

链接exampledepot.com/egs/java.util/Bits2Array.html已过期,你还记得那个例子吗? 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

如果您因字节序问题需要逆序的 BitSet,请更改:

字节[bytes.length-i/8-1] |= 1

到:

字节[i/8] |= 1

【讨论】:

【参考方案3】:

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

【讨论】:

顺便说一下:官方名称是“Java 7”(就像从 Java 5 开始一样,但 Java 5 仍然经常被称为 Java 1.5。Java 6很少称为 Java 1.6)。 @Joachim Sauer,是的官方名称 Java 7。我只是提到了版本。任何方式感谢纠正我。 小心使用 BitSet.toByteArray() 因为它可能不会按照您期望的顺序序列化字节。 BitSet notEqual = BitSet.valueOf(bitset.toByteArray()); // This doesn't work.【参考方案4】:

仅供参考,使用

bits.length()

获取bitset的大小可能会返回不正确的结果;我不得不修改原始示例以利用 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(我猜是使用的内存位大小)。

以上是关于从 BitSet 转换为 Byte 数组的主要内容,如果未能解决你的问题,请参考以下文章

如何将 bitset 转换为 bytes/uint8 数组?

为啥Java中的BitSet使用long数组做内部存储,而不使用int数组...

c#怎么把byte数组转换成图像

将 byte[] 数组转换为长度减半的 short[] 数组

从 MimeMessage 转换为字节数组

c#怎么把byte数组转换为字符串