Я пытаюсь преобразовать массив байтов в 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, два объекта возвращают то же самое, но они кажутся совершенно разными, и эти два объекта имеют разные длины.
Вы пытались заменить 'assertEquals (expectedOutput.toByteArray(), input);' с 'assertEquals (ByteBuffer.wrap (expectedOutput.toByteArray()), ByteBuffer.wrap (input));'? –
@PaulBoddington Обертка байта [] s в ByteBuffer фиксировала AssertionError для метода byteToBits. Почему она исправила ошибку? – user1
Потому что 'byte []' не переопределяет 'equals'. 'equals' для' byte [] 'просто проверяет, являются ли они точно таким же экземпляром. Вы хотите проверить, имеют ли они одинаковые длины и одни и те же элементы. Единственные способы сделать это: «Arrays.equals» или обернуть их в 'ByteBuffer' и проверить ByteBuffers равны. –