我有一个字节数组。我想访问每个字节并希望它的等效二进制值(8位),以便对其执行下一个操作。我听说过BitSet,但有没有其他方法可以解决这个问题?
谢谢。
答案 0 :(得分:9)
如果你只需要二进制的String表示,你可以简单地使用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);
}
答案 1 :(得分:4)
您可能会在Guava Primitives包中找到与您所看到的内容相符的内容。
或者,您可能想要写一些类似
的内容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
)。
答案 2 :(得分:3)
byte ar[] ;
byte b = ar[0];//you have 8 bits value here,if I understood your Question correctly :)
答案 3 :(得分:3)
如果您不使用java 7,可能需要查看源代码的实现方式
答案 4 :(得分:2)
Java有bitwise operators
。请参阅a tutorial example。
Java编程语言还提供对整数类型执行按位和位移操作的运算符。本节中讨论的运算符不太常用。因此,他们的报道很简短;目的是让您意识到这些操作符存在。
一元按位补码运算符“〜”反转位模式;它可以应用于任何整数类型,使每个“0”为“1”,每个“1”为“0”。例如,一个字节包含8位;将此运算符应用于位模式为“00000000”的值会将其模式更改为“11111111”。
byte
值为1,您可以使用屏蔽操作检查位状态。
最低有效位对应于掩码1
或0x1
,下一位对应于0x2
等。
byte b = 3;
if((b & 0x1) == 0x1) {
// LSB is on
} else {
// LSB is off
}
答案 5 :(得分:0)
嗯,我想我明白你的意思。现在一个相当严重的错误是它不会对负数进行处理。但是,假设您没有使用它来读取文件输入,您仍然可以使用它。
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;
}
答案 6 :(得分:0)
这里是一个示例,希望对您有用!
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();
}