我有一个十六进制字符串(sA)从UTF8字符串转换。 当我将十六进制字符串sA转换为UTF8字符串时,我无法在具有构建模式的表单UI中显示它(运行文件.jar)但是当我以运行模式或调试模式运行时,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);
}
答案 0 :(得分:1)
此代码存在多个问题。
字节值的有效范围是-128到127,或十六进制为-80
到7F
,Byte.parseByte
强制执行此操作。如果您的asHex
方法必须处理第二个字节大于127的字符,它将生成一个无法由toHexString
解码的字符串。
asHex
方法仅处理输入字符的第二个字节,因此它仅对前256个Unicode字符正常工作,并为其余字符生成伪造输出。
toHexString
方法从字节数组中解码一个字符串,假设某些特定于平台的默认编码,如果数据被假定为以UTF-8编码并且默认编码是其他内容,则会产生不正确的结果。
为什么要尝试创建自己的方法来编码和解码十六进制字符串,而不是使用一个众所周知且经过测试的库?
答案 1 :(得分:0)
new String(txtInByte, "UTF-8");
如果没有编码,则采用平台编码,例如Windows-1252。反之亦然:String.getBytes
-
String s = "....";
byte[] b = s.getBytes("UTF-8");