簡體   English   中英

將byte []轉換為BitSet

[英]Convert byte[] to BitSet

我正在嘗試將字節數組轉換為BitSet。 以下是我正在使用的代碼:

public BitSet byteToBits(byte[] bytearray){
    BitSet returnValue = new BitSet(bytearray.length*8);
    ByteBuffer  byteBuffer = ByteBuffer.wrap(bytearray);
    //System.out.println(byteBuffer.asIntBuffer().get(1));
    //Hexadecimal values used are Big-Endian, because Java is Big-Endian
    for (int i = 0; i < bytearray.length; i++) {
        byte thebyte = byteBuffer.get(i);
        for (int j = 0; j <8 ; j++) {
            returnValue.set(i*8+j,isBitSet(thebyte,j));
        }
    }
    return returnValue;
}

private static Boolean isBitSet(byte b, int bit)
{
    return (b & (1 << bit)) != 0;
}

我正在使用JUnit測試對其進行測試,如下所示。

@org.junit.Test
public void byteToBits() throws Exception {
    byte[] input = new byte[]{(byte) 0b1011_1011};
    BitSet expectedOutput = new BitSet(8);
    expectedOutput = BitSet.valueOf(new byte[]{(byte)0b1011_1011});
    assertEquals(expectedOutput,converter.byteToBits(input));
    assertEquals(expectedOutput.toByteArray(),input);
}

@Test
public void testBytestoBitslength() throws Exception {
    byte[] input = new byte[]{(byte) 0xFFFF,(byte)0x7F70,(byte)0xF45A,(byte)0xA24B};
    BitSet output = converter.byteToBits(input);
    System.out.println("byte[] length: "+input.length+ "x8: "+input.length*8);
    System.out.println("BitSet length: "+output.length());
    System.out.println(input.toString());
    System.out.println(output.toByteArray().toString());
    assertTrue(output.length()==input.length*8);
}

這段代碼雖然沒有通過測試,但我不明白為什么。

對於byteToBits:

java.lang.AssertionError: 
Expected :[B@6438a396
Actual   :[B@e2144e4

對於testBytestoBitslength:

byte[] length: 4x8: 32
BitSet length: 31
[B@4f2410ac
[B@722c41f4

嘗試用BitSet.valueOf(byte [])方法調用替換它。 它仍然失敗,盡管更有趣。

@Test
public void curiosity() throws Exception {
    byte[] byteArray = new byte[]{1, 2, 3};
    BitSet bitSet = BitSet.valueOf(byteArray);
    System.out.println("byte[]: "+byteArray);
    System.out.println(bitSet.toByteArray());
    assertEquals(ByteBuffer.wrap(byteArray),ByteBuffer.wrap(bitSet.toByteArray()));
    assertEquals(bitSet.length(),byteArray.length*8);
}

這將返回以下內容:

byte[]: [B@6438a396
BitSet: [B@e2144e4

java.lang.AssertionError: 
Expected :18
Actual   :24

當由ByteBuffer包裝時,兩個對象返回相同的東西,但它們看起來完全不同,並且這兩個對象具有不同的長度。

要將字節轉換為BitSet,您應該嘗試

final byte b = ...;
final BitSet set = BitSet.valueOf(new byte[] { b });

您可以參考將byte或int轉換為bitset,它可能會對您有所幫助。

一個人無法直接比較兩個byte[]數組,因為byte[] s不能實現可比性。 這里的解決方案是將它們包裝在ByteBuffer中,如@PaulBoddington所建議的那樣。

assertEquals(ByteBuffer.wrap(expectedOutput.toByteArray()),ByteBuffer.wrap(input));

另一個長度問題是由BitSet本身引起的。 BitSet.length()返回從BitSetBitSet最后一個設置位的長度,這會導致BitSet.length()byte[].length*8 BitSet.length() byte[].length*8的長度不一致。 這里唯一的解決方案是使用BitSet.toByteArray().length*8 ,這里需要BitSet.length()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM