从 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数组...