gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:29:37 24 4
gpt4 key购买 nike

为了从 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 字符串。

请问有人可以向我解释最好的方法吗?

提前致谢!

最佳答案

TL;DR 不要使用toBinaryString()。解决方案见文末。

<小时/>

您的问题是 Integer.toBinaryString() 不返回前导零,例如

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

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

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

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

实现这一点的最简单方法如下:

Integer.toBinaryString((b & 0xFF) | 0x100).substring(1)

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

最好将其作为辅助方法:

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

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

StringBuilder binaryStr = new StringBuilder();
for (byte b : str.getBytes("UTF-8"))
binaryStr.append(toBinary(b));
String result = binaryStr.toString();

例如如果 str = "Hello World",您将得到:

0100100001100101011011000110110001101111001000000101011101101111011100100110110001100100
<小时/>

您当然可以自己完成,而无需求助于toBinaryString():

StringBuilder binaryStr = new StringBuilder();
for (byte b : str.getBytes("UTF-8"))
for (int i = 7; i >= 0; i--)
binaryStr.append((b >> i) & 1);
String result = binaryStr.toString();

这可能也会运行得更快。

关于java - 如何将二进制字符串转换为使用 UTF-8 编码的 Java 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38284354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com