将 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);
}
这 return 如下:
byte[]: [B@6438a396
BitSet: [B@e2144e4
java.lang.AssertionError:
Expected :18
Actual :24
当被一个ByteBuffer包裹时,这两个对象return是一回事,但它们看起来完全不同,而且这两个对象的长度也不同。
要将字节转换为 BitSet,您应该尝试
final byte b = ...;
final BitSet set = BitSet.valueOf(new byte[] { b });
您可以参考
Convert a byte or int to bitset
它可能对你有帮助。
不能直接比较两个 byte[]
数组,因为 byte[]
没有实现可比较。正如@PaulBoddington 所建议的,这里的解决方案是将它们包装在 ByteBuffer 中。
assertEquals(ByteBuffer.wrap(expectedOutput.toByteArray()),ByteBuffer.wrap(input));
另一个长度问题是由BitSet
本身引起的。 BitSet.length()
returns 从索引 0 到 BitSet
中最后一个设置位的长度,这将导致 BitSet.length()
与 byte[].length*8
的长度不一致.这里唯一的解决方案是在需要 BitSet.length()
.
的地方使用 BitSet.toByteArray().length*8
我正在尝试将字节数组转换为 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);
}
这 return 如下:
byte[]: [B@6438a396
BitSet: [B@e2144e4
java.lang.AssertionError:
Expected :18
Actual :24
当被一个ByteBuffer包裹时,这两个对象return是一回事,但它们看起来完全不同,而且这两个对象的长度也不同。
要将字节转换为 BitSet,您应该尝试
final byte b = ...;
final BitSet set = BitSet.valueOf(new byte[] { b });
您可以参考 Convert a byte or int to bitset 它可能对你有帮助。
不能直接比较两个 byte[]
数组,因为 byte[]
没有实现可比较。正如@PaulBoddington 所建议的,这里的解决方案是将它们包装在 ByteBuffer 中。
assertEquals(ByteBuffer.wrap(expectedOutput.toByteArray()),ByteBuffer.wrap(input));
另一个长度问题是由BitSet
本身引起的。 BitSet.length()
returns 从索引 0 到 BitSet
中最后一个设置位的长度,这将导致 BitSet.length()
与 byte[].length*8
的长度不一致.这里唯一的解决方案是在需要 BitSet.length()
.
BitSet.toByteArray().length*8