BitSet有时会掉落比特

问题描述

我目前正在尝试从Java文件中读取一点。

我将数据读入字节数组,然后将字节数组转换为Bitset。

问题在于,转换后的位集中有时会缺少一些位。

在下面的示例中,我有2个字节数组,每个都有25个非常相似的字节。但是其中一个被转换为预期的200位,另一种仅转换为197位,我不知道为什么。

import java.nio.ByteBuffer;
import java.util.BitSet;

public class Main {
    public static void main(String[] args) {
        ByteBuffer cb = ByteBuffer.wrap(new byte[] {(byte)0x18,(byte)0x8C,(byte)0x18,});
        BitSet cBits = BitSet.valueOf(cb);
        System.out.println(cBits.length());
        ByteBuffer db = ByteBuffer.wrap(new byte[] {(byte)0x17,(byte)0x8c,});
        BitSet dBits = BitSet.valueOf(db);
        System.out.println(dBits.length());
    }
}

Doodle

解决方法

Java位集的length()是最高有效位的结果,而不是所传递数组的长度。这与对位集的描述是一种根据需要增长的数据结构是一致的-其逻辑大小是位集的结果,而不是某些底层缓冲区的物理容量。

返回此BitSet的“逻辑大小”:BitSet中最高设置位的索引加1。如果BitSet不包含任何设置位,则返回零。

您的第一个示例的最高有效字节为0x18,即二进制00011000。与第二个位集(其最高有效字节为0x8c(10001100))相比,前三个零位造成了差异。