问题描述
我目前正在尝试从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());
}
}
解决方法
Java位集的length()是最高有效位的结果,而不是所传递数组的长度。这与对位集的描述是一种根据需要增长的数据结构是一致的-其逻辑大小是位集的结果,而不是某些底层缓冲区的物理容量。
返回此BitSet的“逻辑大小”:BitSet中最高设置位的索引加1。如果BitSet不包含任何设置位,则返回零。
您的第一个示例的最高有效字节为0x18,即二进制00011000。与第二个位集(其最高有效字节为0x8c(10001100))相比,前三个零位造成了差异。