Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串toByte和reverse,如果字节被修改,则不是双射的_Java_Bytearray - Fatal编程技术网

Java 字符串toByte和reverse,如果字节被修改,则不是双射的

Java 字符串toByte和reverse,如果字节被修改,则不是双射的,java,bytearray,Java,Bytearray,下面的代码更改字符串的每个字节并创建一个新字符串 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

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

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);
}

当您使用构造函数字符串(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);
}
//仅当使用ASCII作为字符集时
公共静态字符串转换(字符串s){
字符集ASCII=Charset.forName(“ASCII”);
字节[]字节=s.getBytes(ASCII);
byte[]convert=新字节[bytes.length];
for(int i=0;i
因为当您将操纵的字节转换为字符串时,信息会丢失,反之亦然 在下面这行 for(int i=0;i 如果您深入研究字符串到字节转换的实现,反之亦然,您会发现涉及到字符集和编码。
阅读有关它们的内容,您将得到关于这种行为的详细解释。

A
String
不仅仅是一个任意的字节序列。如果要将任意一系列字节编码为文本,请使用Base64等。
// 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);
}
return new String(convert);