如何将字节转换为位?

时间:2010-11-04 09:53:41

标签: java

我有一个字节数组。我想访问每个字节并希望它的等效二进制值(8位),以便对其执行下一个操作。我听说过BitSet,但有没有其他方法可以解决这个问题?

谢谢。

7 个答案:

答案 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;
}

没有经过测试,但这个想法就在那里。还可以轻松修改循环/赋值以返回其他内容的数组(例如,intlong)。

答案 2 :(得分:3)

byte ar[] ;
byte b = ar[0];//you have 8 bits value here,if I understood your Question correctly :)

答案 3 :(得分:3)

BitSet.valueOf(byte[] bytes)

如果您不使用java 7,可能需要查看源代码的实现方式

答案 4 :(得分:2)

Java有bitwise operators。请参阅a tutorial example

  

Java编程语言还提供对整数类型执行按位和位移操作的运算符。本节中讨论的运算符不太常用。因此,他们的报道很简短;目的是让您意识到这些操作符存在。

     

一元按位补码运算符“〜”反转位模式;它可以应用于任何整数类型,使每个“0”为“1”,每个“1”为“0”。例如,一个字节包含8位;将此运算符应用于位模式为“00000000”的值会将其模式更改为“11111111”。

byte值为1,您可以使用屏蔽操作检查位状态。 最低有效位对应于掩码10x1,下一位对应于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();
}