字符串十六进制编码和解码

Arp*_*wal 1 java string ascii utf-8 ebcdic

我正在将一个字符串从UTF-8转换为CP1047,然后对其执行十六进制编码,效果很好.接下来我正在做的是转换回来,使用解码十六进制字符串并以UTF-8格式在控制台上显示它.问题是我没有得到正确的String我传递给编码方法.下面是我编码的代码:

public class HexEncodeDecode {

    public static void main(String[] args) throws UnsupportedEncodingException,
            DecoderException {
        String reqMsg = "ISO0150000150800C220000080000000040000050000000215102190000000014041615141800001427690161 0B0    000123450041234";
        char[] hexed = getHex(reqMsg, "UTF-8", "Cp1047");

        System.out.println(hexed);

        System.out.println(getString(hexed));
    }

    public static char[] getHex(String source, String inputCharacterCoding,
            String outputCharacterCoding) throws UnsupportedEncodingException {
        return Hex.encodeHex(new String(source.getBytes(inputCharacterCoding),
                outputCharacterCoding).getBytes(), false);
    }

    public static String getString(char[] source) throws DecoderException,
            UnsupportedEncodingException {
        return new String(Hex.decodeHex(source), Charset.forName("UTF-8"));
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

    C3B1C3AB7CC290C291C295C290C290C290C290C291C295C290C298C290C290C3A41616C290C290C290C290C290C298C290C290C290C290C290C290C290C290C294C290C290C290C290C290C295C290C290C290C290C290C290C29016C291C295C291C29016C291C299C290C290C290C290C290C290C290C290C291C294C290C294C291C296C291C295C291C294C291C298C290C290C290C290C291C2941604C296C299C290C291C296C291C280C290C3A2C290C280C280C280C280C290C290C290C29116C293C294C295C290C290C294C29116C293C294
ñë|äâ
Run Code Online (Sandbox Code Playgroud)

因此,需要帮助打印输入String.

预期产出将是:

C3B1C3AB7CC290C291C295C290C290C290C290C291C295C290C298C290C290C3A41616C290C290C290C290C290C298C290C290C290C290C290C290C290C290C294C290C290C290C290C290C295C290C290C290C290C290C290C29016C291C295C291C29016C291C299C290C290C290C290C290C290C290C290C291C294C290C294C291C296C291C295C291C294C291C298C290C290C290C290C291C2941604C296C299C290C291C296C291C280C290C3A2C290C280C280C280C280C290C290C290C29116C293C294C295C290C290C294C29116C293C294
ISO0150000150800C220000080000000040000050000000215102190000000014041615141800001427690161 0B0    000123450041234
Run Code Online (Sandbox Code Playgroud)

fge*_*fge 5

new String(source.getBytes(inputCharacterCoding), outputCharacterCoding)
    .getBytes()
Run Code Online (Sandbox Code Playgroud)

这可能不符合您的想法.

首先要做的事情是:a String没有编码.在我之后重复:a String没有编码.

A String只是一系列旨在表示字符的标记.只是为了这个目的,Java使用了一系列的chars.它们也可以是载体鸽.

UTF8,CP1047和其他只是字符编码; 可以执行两个操作:

  • 编码:将载体char流转换为字节流;
  • 解码:将字节流转换为载体流的流char.

基本上,你的基本假设是错误的; 你不能将编码与a关联String.您的实际输入应该是一个byte流(通常是一个字节数组),您知道它是特定编码(在您的情况下,UTF-8)的结果,您希望使用另一个字符集重新编码(在您的情况下) ,CP1047).

这里的真正答案的"秘密"将是你的Hex.encodeHex()方法的代码,但你没有显示它,所以这是一个很好的答案,我可以集合.