如何将字节转换为二进制字符串表示形式

Sea*_*ean 84 java binary byte

例如,一个字节B中的位是10000010,如何将字符串分配给字符串str,即str = "10000010".

编辑

我从二进制文件中读取字节,并存储在字节数组中B.我用System.out.println(Integer.toBinaryString(B[i])).问题是

(a)当位以(最左边)1开始时,输出不正确,因为它转换B[i]为负的int值.

(b)如果位开头0,则输出忽略0,例如,假设B[0]为00000001,1而不是输出00000001

Joã*_*lva 159

用途Integer#toBinaryString():

byte b1 = (byte) 129;
String s1 = String.format("%8s", Integer.toBinaryString(b1 & 0xFF)).replace(' ', '0');
System.out.println(s1); // 10000001

byte b2 = (byte) 2;
String s2 = String.format("%8s", Integer.toBinaryString(b2 & 0xFF)).replace(' ', '0');
System.out.println(s2); // 00000010
Run Code Online (Sandbox Code Playgroud)

演示.

  • @Sean:`&0xFF`基本上将`signed byte`转换为`unsigned integer`.例如,`-129`,就像你说的那样,由`11111111111111111111111110000001`表示.在这种情况下,你基本上想要第一个(最低有效)8位,所以你和`(&`)它与`0xFF`(`00000000000000000000000011111111`),有效地清理我们不关心的左边的1,只留下'10000001`. (8认同)
  • @Sean:a) 发生是因为 Java 中的“字节”是一个 8 位有符号二进制补码整数。其最小值为-128(2^8),最大值为`127`;b) 您可以通过使用这个 `String.format("%8s", Integer.toBinaryString(b)).replace(' ', '0')` 来轻松地解决这个问题,用零填充结果字符串。 (2认同)

Rae*_*kye 27

我用过这个.与其他答案类似的想法,但没有看到任何地方的确切方法:)

System.out.println(Integer.toBinaryString((b & 0xFF) + 0x100).substring(1));
Run Code Online (Sandbox Code Playgroud)

0xFF是255,或11111111(无符号字节的最大值). 0x100是256,或100000000

&字节向上转换为整数.那时,它可以是0- 255(0000000011111111,我排除了前24位).+ 0x100.substring(1)确保会有前导零.

我和JoãoSilva的回答相比,这个时间要快10倍.http://ideone.com/22DDK1我没有包含Pshemo的答案,因为它没有正确填充.

  • @ConnerDassen 它确保二进制字符串是 0 填充的。例如,如果`b` 是`1`,如果没有`+ 0x100`,你只会得到`"1"` 作为你的字符串。通过添加`1`,你得到`100000001`,如果你忽略第一个字符的子字符串,你将得到正确的`"00000001"`。如果你不想填充你的字符串,你可以简单地使用`Integer.toBinaryString(b & 0xff)`。`& 0xff` 修复了负数/二进制补码问题 (2认同)

Psh*_*emo 7

这是你想要的?

从String转换为byte

byte b = (byte)(int)Integer.valueOf("10000010", 2);
System.out.println(b);// output -> -126
Run Code Online (Sandbox Code Playgroud)

从byte转换为String

System.out.println(Integer.toBinaryString((b+256)%256));// output -> "10000010"
Run Code Online (Sandbox Code Playgroud)

或者正如JoãoSilva在他的评论中所说的那样添加前导0我们可以将字符串格式化为长度8并将结果前导空格替换为零,所以在字符串的情况下" 1010"我们会得到"00001010"

System.out.println(String.format("%8s", Integer.toBinaryString((b + 256) % 256))
                         .replace(' ', '0'));
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以检查字节上的每一位,然后将 0 或 1 附加到字符串。这是我为测试编写的一个小助手方法:

public static String byteToString(byte b) {
    byte[] masks = { -128, 64, 32, 16, 8, 4, 2, 1 };
    StringBuilder builder = new StringBuilder();
    for (byte m : masks) {
        if ((b & m) == m) {
            builder.append('1');
        } else {
            builder.append('0');
        }
    }
    return builder.toString();
}
Run Code Online (Sandbox Code Playgroud)


jam*_*mee 5

获取字节的每一位并转换为字符串。假设字节有 8 位,我们可以通过位移动来一一获取。例如,我们将字节6位的第二位向右移动,8位位的最后的第二位,然后和(&)用0x0001清除前面的位。

public static String getByteBinaryString(byte b) {
    StringBuilder sb = new StringBuilder();
    for (int i = 7; i >= 0; --i) {
        sb.append(b >>> i & 1);
    }
    return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)