String text = textpane.getText();    //textpane是一个JTextComponent  textpane返回的是GB2312编码的字符串byte[] bytes = null;
try {
    bytes = text.getBytes("GB2312");      //使用GB2312字符集将text解码为字节序列,将结果存储到bytes中
} catch (UnsupportedEncodingException ex) {
    ex.printStackTrace();
}   
String hexstr = "";                             //hexstr 是bytes转换成十六进制字符串的集合
for(int i=0; i<bytes.length; i++){              //组成hexstr 的过程
    hexstr = hexstr.concat(Integer.toHexString(bytes[i])+" ");
}
    
这里面有两个问题让我困扰,我希望的是bytes 数组的每个byte 都能转换成像 FF D8 9E 这样的字符串,但不理想的是textpane 里面的文本很杂乱 有数字,字母,汉字,回车.数字和字母还不错,得到的是正确的十六进制编码.  但回车得到的就只有一个 a  还有汉字得到的有很多都是五六个F加正确的编码 像 "ffffff3b",我截取了返回带有F的byte 发现都是负数,这难道是java 的缺陷吗?  谁能给我解释解释.  还有在GB2312里数字和回车 是怎么编码的 , 我知道空格是"20"

解决方案 »

  1.   

    因为一个字符是使用两个byte存储的,如果转换出的2个byte中最高位恰好为1,则会被解释成负数。所以如果你想转换成16进制的字符串的换可以这样转换Integer.toHexString((char)bytes[i])GB2312编码和ACSII是兼容的,所以\r是13,\n是10,这个你可以使用以下的方式输出:
    System.out.println((int)'\r');
      

  2.   

    谢谢 网络咖啡的热心解答
    你的bytes[i]转换char的方法我试过了,结果是返回的六个F都变成了2个了,怎么能彻底让它没有呢?
    还有我在UltraEdit-32里看到回车十六进制是0D 0A   空格是 20  是怎么回事呀?
      

  3.   

    真的是这样的,可以给text赋汉字的字符串,然后打印hexstr试试,几乎每一个前面都是2个f
      

  4.   

    String.format("%02X", bytes[i]);JDK 1.5 及以上版本适用
      

  5.   

    谢谢大家参与
    火龙果的方法是很好,但是如果我要是还想反转的话就有点麻烦了.
    我就希望Integer.toHexString() 能够得到正确的十六进制字符串
    再考虑通过一些方法将这些字符串转回汉字
      

  6.   

    Integer.toHexString 在参数为负数的情况下,好像有bug
    我以前也遇到了类似的问题