[英]Why is wrong bit representation got by converting byte array to BitSet in Java
[英]Java BitSet wrong conversion from/to byte array
使用BitSet,我的測試失敗:
BitSet bitSet = new BitSet();
bitSet.set(1);
bitSet.set(100);
logger.info("BitSet: " + BitSetHelper.toString(bitSet));
BitSet fromByteArray = BitSetHelper.fromByteArray(bitSet.toByteArray());
logger.info("fromByteArray: " + BitSetHelper.toString(bitSet));
Assert.assertEquals(2, fromByteArray.cardinality());
Assert.assertTrue(fromByteArray.get(1)); <--Assertion fail!!!
Assert.assertTrue(fromByteArray.get(100)); <--Assertion fail!!!
更奇怪的是,我可以看到兩個BitSet的String表示形式:
17:34:39.194 [main] INFO c.i.uniques.helper.BitSetHelperTest - BitSet: 00000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000
17:34:39.220 [main] INFO c.i.uniques.helper.BitSetHelperTest - fromByteArray: 00000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000
等於! 這里發生了什么事??
此示例上使用的方法是:
public static BitSet fromByteArray(byte[] bytes) {
BitSet bits = new BitSet();
for (int i = 0; i < bytes.length * 8; i++) {
if ((bytes[bytes.length - i / 8 - 1] & (1 << (i % 8))) > 0) {
bits.set(i);
}
}
return bits;
}
以及用於獲取String表示形式的方法:
public static String toString(BitSet bitSet) {
StringBuffer buffer = new StringBuffer();
for (byte b : bitSet.toByteArray()) {
buffer.append(String.format("%8s", Integer.toBinaryString(b & 0xFF)).replace(' ', '0'));
}
return buffer.toString();
}
有人可以解釋這里發生了什么嗎?
請注意, BitSet
有一個valueOf(byte[])
已經為您完成此操作。
在您的fromByteArray
方法內部
for (int i = 0; i < bytes.length * 8; i++) {
if ((bytes[bytes.length - i / 8 - 1] & (1 << (i % 8))) > 0) {
bits.set(i);
}
}
您正在反向遍歷byte[]
。 在第一次迭代中,
bytes.length - i / 8 - 1
將評估為
8 - (0 / 8) - 1
這是7
,它將訪問最高有效字節。 這是包含原始位集中的第100個位的位。 從背面看,這是第四位。 並且,如果您檢查生成的BitSet
設置的位,則會注意到第5位和第98位(這里可能是一個錯誤關閉)而已設置。
但是toByteArray()
返回的byte[]
包含
該位集中所有位的小端序表示
您需要以適當的順序讀取byte[]
for (int i = 0; i < bytes.length * 8; i++) {
if ((bytes[i / 8] & (1 << (i % 8))) > 0) {
bits.set(i);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.