2013-09-25 29 views
0

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

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
new String(txtInByte, "UTF-8"); 

没有编码采取平台编码,例如Windows-1252。同样的反过来:String.getBytes-

String s = "...."; 
byte[] b = s.getBytes("UTF-8"); 
1

该代码有多个问题。

字节值的有效范围是-128到127,或者-807F(十六进制),而Byte.parseByte强制执行此操作。如果您的asHex方法必须处理第二个字节大于127的字符,它将生成一个字符串,该字符串不能被toHexString解码。

asHex方法只处理输入字符的第二个字节,所以它只能对前256个Unicode字符正确工作,并为其余的字符输出伪造输出。

toHexString方法从字节数组中解码出一个字符串,并假定某些特定于平台的默认编码,如果数据被认为是以UTF-8编码并且默认编码是别的,那么这将导致错误的结果。

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

相关问题