我有一个字节数组。我想访问每个字节并获取其等效的8位二进制值,以便进行下一步操作。我听说过BitSet,但还有其他处理这个问题的方法吗?
谢谢。
谢谢。
如果你只需要它的二进制字符串表示,你可以简单地使用 Integer.toString()
方法,将可选的第二个参数设置为2。
要对任何整数类型执行常规位操作,你必须使用逻辑和移位运算符。
// tests if bit is set in value
boolean isSet(byte value, int bit){
return (value&(1<<bit))!=0;
}
// returns a byte with the required bit set
byte set(byte value, int bit){
return value|(1<<bit);
}
public boolean[] convert(byte...bs) {
boolean[] result = new boolean[Byte.SIZE*bs.length];
int offset = 0;
for (byte b : bs) {
for (int i=0; i<Byte.SIZE; i++) result[i+offset] = (b >> i & 0x1) != 0x0;
offset+=Byte.SIZE;
}
return result;
}
这个还没有经过测试,但是想法已经有了。循环和赋值也可以进行简单的修改,以返回其他类型的数组(比如 int
或 long
)。
Java有位运算符。请参阅教程示例。
Java编程语言还提供了对整数类型执行按位和位移操作的运算符。本节讨论的运算符很少使用。因此,它们的涵盖范围很简短;其目的只是让您知道这些运算符存在。
一元位补码运算符“~”反转一个位模式;它可以应用于任何整数类型,使每个“0”变为“1”,每个“1”变为“0”。例如,一个字节包含8位;将此运算符应用于其位模式为“00000000”的值将更改其模式为“11111111”。
byte
值是整数型的,您可以使用掩码操作来检查位状态。最低有效位对应于掩码1
或0x1
,下一个位对应于0x2
,依此类推。
byte b = 3;
if((b & 0x1) == 0x1) {
// LSB is on
} else {
// LSB is off
}
if(b & 0x1)
不能编译。你必须使用if(b & 0x1 == 0x1)
。 - Peter Knegobyte ar[] ;
byte b = ar[0];//you have 8 bits value here,if I understood your Question correctly :)
我想我明白你的意思。现在这个方法有一个相当大的错误,就是它不能处理负数。但是假设你不是用它来读取文件输入,你可能仍然能够使用它。
public static ArrayList<Boolean> toBitArr(byte[] bytearr){
ArrayList<Boolean> bitarr = new ArrayList<Boolean>();
ArrayList<Boolean> temp = new ArrayList<Boolean>();
int i = 0;
for(byte b: bytearr){
while(Math.abs(b) > 0){
temp.add((b % 2) == 1);
b = (byte) (b >> 1);
}
Collections.reverse(temp);
bitarr.addAll(temp);
temp.clear();
}
return bitarr;
}
这是一个样例,希望对您有所帮助!
DatagramSocket socket = new DatagramSocket(6160, InetAddress.getByName("0.0.0.0"));
socket.setBroadcast(true);
while (true) {
byte[] recvBuf = new byte[26];
DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);
socket.receive(packet);
String bitArray = toBitArray(recvBuf);
System.out.println(Integer.parseInt(bitArray.substring(0, 8), 2)); // convert first byte binary to decimal
System.out.println(Integer.parseInt(bitArray.substring(8, 16), 2)); // convert second byte binary to decimal
}
public static String toBitArray(byte[] byteArray) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < byteArray.length; i++) {
sb.append(String.format("%8s", Integer.toBinaryString(byteArray[i] & 0xFF)).replace(' ', '0'));
}
return sb.toString();
}