代码之家  ›  专栏  ›  技术社区  ›  Mike B

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

  •  3
  • Mike B  · 技术社区  · 14 年前

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

    String temp = new String(encodedBytes, "UTF-8");
    

    只有让调试器显示encodedbytes包含 "\ufffd\ufffd ^\ufffd\ufffd-m\ufffd\ufffd\/ufffd \ufffd\ufffdIA\ufffd\ufffd" . 字符串应包含字母数字格式的哈希。

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

    2 回复  |  直到 14 年前
        1
  •  7
  •   user7094    14 年前

    如果您的字符串是密码散列方案的输出(看起来可能是这样),那么我认为您需要base64编码才能将其转换为纯文本。

    如果有原始字节要输出到文本文件,标准过程是使用base 64编码。这个 Commons Codec 库提供了一个base64编码器/解码器供您使用。

    希望这有帮助。

        2
  •  10
  •   trashgod    14 年前

    字节数组不像UTF-8。注意 \ufffd (命名) REPLACEMENT CHARACTER "used to replace an incoming character whose value is unknown or unrepresentable in Unicode."

    附录:这里有一个简单的例子说明了这是如何发生的。当铸造到 byte ,的代码点 ñ 既不是UTF-8也不是US-ASCII;但是 有效的ISO-8859-1。实际上,在将字节编码为 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"));
        }
    }
    

    输出:

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