日期:2014-05-20  浏览次数:20822 次

如何将十六进制转换成字符串
帮我实现UltraEdit-32里面的HEX模式, 
  我这里举个例子:
进行十六进制转换 byte[] byte = {FF ,FA, 18 ,00 ,41 ,4E ,53 ,49 ,FF ,F0};
实现:
00000000 FF FA 18 00 41 4E 53 49 FF F0 ?...ANSI? (后面其实是乱码没有显示)
 

------解决方案--------------------
不是很明白LZ要求,给你一个参考(就你的EX)
Java code


public class hextostring {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        byte[] b = {(byte) 0xFF ,(byte)0xFA, 0x18 ,0x00 ,0x41 ,0x4E ,0x53 ,0x49 ,(byte)0xFF ,(byte)0xF0};
        String s=new String();
        try {
            s=new String(b, "UTF-8");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.printf("%08x ",0);
        for(int i=0;i<b.length;i++)
            System.out.printf("%02X ",b[i]);

        
        System.out.println(s);
        
    }

}

------解决方案--------------------
没看清什么要求
------解决方案--------------------
看不得不是很懂..
------解决方案--------------------
准确点说,应该是:如何把字节数组转换成十六进制的整数
Java code

public class Convert {
    
    /**
     * 将字节数组编码成十六进制表示的字符串,每个字节用两个十六进制字符表示,不足两位
     * 时在左边补0
     * @param data 被编码的字节数组
     * @param seperator 字节之间的分隔符
     * @return 转换后的字符串
     */
    public static String toHexString(byte[] data, String seperator){
        StringBuilder sb = new StringBuilder(data.length * (2 + seperator.length()));
        
        int pb = 0;
        String pre = "";
        while(pb < data.length){
            byte b = data[pb++];
            
            int h = ((0xF0 & b) >> 4);
            int l = (0x0F & b);
            
            sb.append(pre);
            if(h < 10){
                sb.append((char)('0' + h));
            }else{
                sb.append((char)('a' + h - 10));
            }
            if(l < 10){
                sb.append((char)('0' + l));
            }else{
                sb.append((char)('a' + l - 10));
            }
            pre = seperator;
        }
        
        return sb.toString();
    }
    
    /**
     * 将十六进制字符串表示的字节数据还原成字节数组
     * @param text 被还原的字符串
     * @return 还原之后的字节数组
     */
    public static byte[] fromHexString(String text){
        if(text == null)
            return new byte[0];
        
        byte[] result = new byte[text.length() / 2];
        
        text = text.toLowerCase();
        int pb = 0;
        int ps = 0;
        while(pb < result.length && ps < text.length()){
            char ch = text.charAt(ps++);
            char cl = text.charAt(ps++);
            
            int a = 0;
            int b = 0;
            if('0' <= ch && ch <= '9'){
                a = ch - '0';
            }else{
                a = ch - 'a' + 10;
            }
            if('0' <= cl && cl <= '9'){
                b = cl - '0';
            }else{
                b = cl - 'a' + 10;
            }
            
            result[pb++] = (byte)((a << 4) + b);
        }
        
        return result;
    }
}

------解决方案--------------------
已测试的:
Java code


public class strtohex {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String s="import方式可以改变Ecl111,This is a test!";
//        String s="12345678901234567";
        byte b[]=s.getBytes();
        int i,j;
        for( i=0;i<b.length/16;i++)
        {
            System.out.printf("%08x: ",i);
            for(j=0;j<16;j++)
            {
                System.out.printf("%02X ", b[i*16+j]);                
            }
            String s1=null;
            try {
            s1=new String(b,"ISO8859-1");
            s1=s1.substring(i*16,i*16+16);
            s1=new String(s1.getBytes("ISO8859-1"),"GBK"); //linux:UTF-8
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.print("; ");
        System.out.println(s1);
       }
       int l=b.length; 
       if (l%16!=0)
       {
           System.out.printf("%08x: ",i);
           for(j=i*16;j<l;j++)
                System.out.printf("%02X ", b[j]);                
           for(j=0;j<16-l%16;j++)
               System.out.print("00 ");                

               String s1=null;
               try {
               s1=new String(b,"ISO8859-1");
               s1=s1.substring(i*16,i*16+l%16);
               s1=new String(s1.getBytes("ISO8859-1"),"GBK"); //linux:UTF-8
           } catch (Exception e) {
               e.printStackTrace();
           }
           System.out.print("; ");
           System.out.println(s1);
          }
       }
    }