如何将二进制字符串转换为使用UFT-8编码的Java字符串

时间:2016-07-09 17:20:27

标签: java string utf-8 binary byte

为了从4个字符串的字符串发送一大块位,我正在从字符串中获取字节数组并计算位字符串。

StringBuilder binaryStr = new StringBuilder();

byte[] bytesFromStr = str.getBytes("UTF-8");
for (int i = 0, l = bytesFromStr.length; i < l; i++) {
    binaryStr.append(Integer.toBinaryString(bytesFromStr[i]));
}

String result = binaryStr.toString();

当我想要执行反向操作时出现问题:将位字符串转换为使用UTF-8编码的Java字符串。

拜托,有人可以解释我最好的方法吗?

提前致谢!

2 个答案:

答案 0 :(得分:2)

TL; DR请勿使用runnable。最后见解决方案。

你的问题是toBinaryString()没有返回前导零,例如

Integer.toBinaryString()

出于您的目的,您希望每个字节始终获得8位。

您还需要防止负值导致错误,例如

System.out.println(Integer.toBinaryString(1));   // prints: 1
System.out.println(Integer.toBinaryString(10));  // prints: 1010
System.out.println(Integer.toBinaryString(100)); // prints: 1100100

最简单的方法就是这样:

System.out.println(Integer.toBinaryString((byte)129)); // prints: 11111111111111111111111110000001

首先,它将字节Integer.toBinaryString((b & 0xFF) | 0x100).substring(1) 强制转换为b,然后仅保留低8位,最后设置第9位,例如int(十进制)变为129(二进制,为清晰起见添加了空格)。然后排除了第9位,实际上确保了前导零。

最好将其作为辅助方法:

1 1000 0001

在这种情况下,您的代码变为:

private static String toBinary(byte b) {
    return Integer.toBinaryString((b & 0xFF) | 0x100).substring(1);
}

E.g。如果StringBuilder binaryStr = new StringBuilder(); for (byte b : str.getBytes("UTF-8")) binaryStr.append(toBinary(b)); String result = binaryStr.toString(); ,你会得到:

str = "Hello World"

你当然可以自己做,而不是诉诸0100100001100101011011000110110001101111001000000101011101101111011100100110110001100100

toBinaryString()

这也可能会跑得更快。

答案 1 :(得分:0)

感谢@Andreas提供的代码。我使用你的函数测试并使用它再次“解码”到UTF-8:

StringBuilder revealStr = new StringBuilder();
for (int i = 0; i < result.length(); i += 8) {
    revealStr.append((char) Integer.parseUnsignedInt(result.substring(i, i + 8), 2));
} 

感谢所有人帮助我。