【问题标题】:Converting from BitSet to Byte array从 BitSet 转换为 Byte 数组
【发布时间】: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;
}

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

【问题讨论】:

标签: java bitset


【解决方案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(我猜是使用的内存位大小)。
      猜你喜欢
      • 2016-07-08
      • 2021-04-07
      • 2012-01-08
      • 2016-01-29
      • 2012-05-18
      • 2020-05-17
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      相关资源
      最近更新 更多