gpt4 book ai didi

java - String toByte 和 reverse,如果字节被修改则不是双射的

转载 作者:搜寻专家 更新时间:2023-11-01 03:07:24 25 4
gpt4 key购买 nike

以下代码更改字符串的每个字节并创建一个新字符串。

public static String convert(String s) {
byte[] bytes = s.getBytes();
byte[] convert = new byte[bytes.length];

for (int i = 0; i < bytes.length; i++) {
convert[i] = (byte) ~bytes[i];
}

return new String(convert);
}

问题:为什么 convert() 不是双射的?

convert(convert("Test String")).equals("Test String") === false

最佳答案

当您使用构造函数 String(byte[]) 时,它不一定每个字节一个字母,它采用默认字符集;例如,如果它是 UTF-8,那么构造函数将尝试从两个或三个字节而不是一个字节解码一些字符。

由于您使用位补码逐字节转换,因此当您应用默认字符集时,结果可能会有所不同。

如果您使用ASCII字符,您可以试试这个版本的函数:

// ONLY if you use ASCII as Charset
public static String convert(String s) {
Charset ASCII = Charset.forName("ASCII");
byte[] bytes = s.getBytes(ASCII);
byte[] convert = new byte[bytes.length];

for (int i = 0; i < bytes.length; i++) {
convert[i] = (byte) (~bytes[i] & 0x7F);
}

return new String(convert, ASCII);
}

关于java - String toByte 和 reverse,如果字节被修改则不是双射的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17759997/

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