将字节数组转换为可理解的字符串

Mik*_*e B 3 java unicode hash ascii

我有一个用Java处理字节数组的程序,现在我想把它写成一个XML文件.但是,我不确定如何将以下字节数组转换为合理的字符串以写入文件.假设它是Unicode字符,我尝试了以下代码:

String temp = new String(encodedBytes, "UTF-8");
Run Code Online (Sandbox Code Playgroud)

只是让调试器显示encodedBytes包含"\ufffd\ufffd ^\ufffd\ufffd-m\ufffd\ufffd\/ufffd \ufffd\ufffdIA\ufffd\ufffd".String应包含字母数字格式的哈希.

如何将上面的String转换为合理的输出字符串?

tra*_*god 10

字节数组看起来不像UTF-8.请注意,\ufffd(named REPLACEMENT CHARACTER)"用于替换其值在Unicode中未知或不可表示的传入字符."

附录:这是一个如何发生这种情况的简单例子.当转换为a时byte,代码点ñ既不是UTF-8也不是US-ASCII; 但它有效的ISO-8859-1.实际上,在将它们编码为a之前,你必须知道字节代表什么String.

public class Hello {

    public static void main(String[] args)
            throws java.io.UnsupportedEncodingException {
        String s = "Hola, señor!";
        System.out.println(s);
        byte[] b = new byte[s.length()];
        for (int i = 0; i < b.length; i++) {
            int cp = s.codePointAt(i);
            b[i] = (byte) cp;
            System.out.print((byte) cp + " ");
        }
        System.out.println();
        System.out.println(new String(b, "UTF-8"));
        System.out.println(new String(b, "US-ASCII"));
        System.out.println(new String(b, "ISO-8859-1"));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Hola, señor!
72 111 108 97 44 32 115 101 -15 111 114 33 
Hola, se?or!
Hola, se?or!
Hola, señor!


小智 7

如果您的字符串是密码散列方案的输出(看起来可能是它),那么我认为您需要使用Base64编码才能将其放入纯文本中.

标准过程,如果您要输出到文本文件的原始字节,则使用Base 64编码.该共享编解码器库为您提供了使用一个Base64编码器/解码器.

希望这可以帮助.