0

我有一个从 UTF8 字符串转换的十六进制字符串 (sA)。当我将十六进制字符串 sA 转换为 UTF8 字符串时,我无法使用构建模式(运行文件 .jar)在表单 UI 中显示它,但是当我使用运行模式或调试模式运行时,UTF8 字符串可以在表单 UI 中显示。我使用 netbeans IDE 7.3.1。我的代码如下:

public String hexToString(String txtInHex) {
    byte[] txtInByte = new byte[txtInHex.length() / 2];
    int j = 0;
    for (int i = 0; i < txtInHex.length(); i += 2) {
        txtInByte[j++] = Byte.parseByte(txtInHex.substring(i, i + 2), 16);
    }
    return new String(txtInByte);
}

private String asHex(byte[] buf) {
    char[] chars = new char[2 * buf.length];
    for (int i = 0; i < buf.length; ++i) {
        chars[2 * i] = HEX_CHARS[(buf[i] & 0xF0) >>> 4];
        chars[2 * i + 1] = HEX_CHARS[buf[i] & 0x0F];
    }
    return new String(chars);
}
4

2 回答 2

1

此代码存在多个问题。

字节值的有效范围是 -128 到 127,或-807F十六进制表示,并Byte.parseByte强制执行此操作。如果您的asHex方法必须处理第二个字节大于 127 的字符,它将产生一个无法由toHexString.

asHex方法只处理输入字符的第二个字节,因此它只对前 256 个 Unicode 字符正常工作,而对其余字符产生虚假输出。

toHexString方法假设某些特定于平台的默认编码从字节数组中解码字符串,如果数据被假定为 UTF-8 编码并且默认编码是其他东西,这将给出不正确的结果。

为什么您尝试创建自己的编码和解码十六进制字符串的方法,而不是使用众所周知且经过测试的库?

于 2013-09-25T16:44:59.820 回答
0
new String(txtInByte, "UTF-8");

如果没有编码,则采用平台编码,例如 Windows-1252。它的逆也一样:String.getBytes-

String s = "....";
byte[] b = s.getBytes("UTF-8");
于 2013-09-25T17:23:50.770 回答