为了从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字符串。
拜托,有人可以解释我最好的方法吗?
提前致谢!
答案 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));
}
感谢所有人帮助我。