2016-03-22 9 views
0

Я пытаюсь преобразовать массив байтов в 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 :[[email protected] 
Actual :[[email protected] 

Для testBytestoBitslength:

byte[] length: 4x8: 32 
BitSet length: 31 
[[email protected] 
[[email protected] 

Пытались заменить его BitSet.valueOf (байт []) метод вызова. Он все еще терпит неудачу, хотя и интереснее.

@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[]: [[email protected] 
BitSet: [[email protected] 

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

Когда обернут ByteBuffer, два объекта возвращают то же самое, но они кажутся совершенно разными, и эти два объекта имеют разные длины.

+0

Вы пытались заменить 'assertEquals (expectedOutput.toByteArray(), input);' с 'assertEquals (ByteBuffer.wrap (expectedOutput.toByteArray()), ByteBuffer.wrap (input));'? –

+0

@PaulBoddington Обертка байта [] s в ByteBuffer фиксировала AssertionError для метода byteToBits. Почему она исправила ошибку? – user1

+0

Потому что 'byte []' не переопределяет 'equals'. 'equals' для' byte [] 'просто проверяет, являются ли они точно таким же экземпляром. Вы хотите проверить, имеют ли они одинаковые длины и одни и те же элементы. Единственные способы сделать это: «Arrays.equals» или обернуть их в 'ByteBuffer' и проверить ByteBuffers равны. –

ответ

0

Нельзя сравнивать два массива byte[], так как byte[] s dont реализовать сопоставимые. Решением здесь было бы обернуть их в ByteBuffer, как было предложено @PaulBoddington.

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

Другой вопрос, длина обусловлена ​​самим BitSet. BitSet.length() возвращает длину от индекса 0 до последнего установленного бита в BitSet, что приведет к несоответствию в длине BitSet.length() против byte[].length*8. Единственным решением здесь было бы использовать BitSet.toByteArray().length*8, где когда-либо возникнет необходимость в BitSet.length().

0

Для преобразования байт BITSET вы должны попробовать

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

Вы можете обратиться к Convert a byte or int to bitset это может помочь вам.

+0

Я отредактировал вопрос, чтобы попробовать это, он, похоже, не работает. – user1

 Смежные вопросы

  • Нет связанных вопросов^_^