输入16进制数序列,将其二进制反序并输出新的16进制数

输入16进制数序列,如

输入:1a1bf

二进制:0001 1010 0001 1011 1111

反转:1111  1101 1000 0101 1000

输出:FD858

import java.io.BufferedReader;
import java.io.InputStreamReader;


public class BitReverse {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
        try {
            String string = bReader.readLine();
            bReader.close();
            
            byte[] bt = getByte(string);
            //System.out.println("bt"+bt.length);
            
            byte[] res = new byte[bt.length];
            for(int i=0; i<res.length; ++i){
                res[i] = reverse(bt[res.length-i-1]);
            }
            
            print(res);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    /**
     * 将读入的16进制序列字符串,转换为byte数组
     * @param str
     * @return
     * @throws Exception
     */
    private static byte[] getByte(String str) throws Exception{
        byte[] bt = new byte[(int)Math.round(str.length()/2.0)];
        str = str.toLowerCase();
        
        int k = 0, j = 0;
        for(int i=0; i<str.length(); i=i+2){
            k = 0; 
            j = 0;
            k = getInt(str.charAt(i));
            if((i+1)<str.length())
                j = getInt(str.charAt(i+1));
            bt[(i/2)] = (byte)((k<<4) | j);
        }
        return bt;
    }
    
    /**
     * 将一个表示16进制的字符,转为相应的数字,用int存储,a-10,b-11,5-5
     * @param temp
     * @return
     * @throws Exception
     */
    private static int getInt(char temp) throws Exception{
        if(temp >= '0' && temp <= '9') return (temp-'0');
        else if (temp >= 'a' && temp <= 'f') {
            return (temp-'a'+10);
        }else {
            throw new Exception("非十六进制数");
        }
    }
    
    /**
     * 对byte b的二进制进行反转,使用Integer的reverse函数。也可自己进行位操作
     * @param b
     * @return
     */
    private static byte reverse(byte b){
        Integer temp = (int)b;
        temp = Integer.reverse(temp);
        return (byte)(temp>>24);
    }
    
    private static void print(byte[] b){
        String string = "";
        for(int i=0; i<b.length; ++i){
            string += Integer.toHexString(b[i] & 0xff);
        }
        System.out.println(string.toUpperCase());
    }
}
posted @ 2015-05-10 21:12  Spanda  阅读(1531)  评论(0编辑  收藏  举报