16進数シーケンスを入力し、そのバイナリを逆シーケンスして新しい16進数を出力します.

7466 ワード

16進数のシーケンスを入力します.
入力:1 a 1 bf
バイナリ:0001 1010 0001 1011 1111
反転:1111 1101 1000 0101 1000
出力:FD 858
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());

    }

}