I was working on a simple project that simulate CPU registers, where users can use an assembly-like commands to issue some process while watching changes on the virtual CPU registers.

you may visit it using this link: http://www.doitmyway.net/2010/02/21/cpu-registers-simulator-educational-project/

In fact CPU data are in binary, although users may want to read those data in different format. So I implemented a simple Java class to convert numbers from/to binary, octal, decimal and hexadecimal.

There are 6 main functions:

  • decToBin
  • binToDec
  • octToBin
  • binToOct
  • hexToBin
  • binToHex

The other functions are supporting functions or functions based on the main functions, e.g, decToHex is a combination of decToBin and binToHex.

baseConvertor.java

//DoItMyWay.net
//a7med.yamani@gmail.com
//licensed under gpl v3 :)
 
package cpuregsim;
 
public class baseConvertor {
 
    //reverse string, give it "abc" and it will returns "cba"
    public String reverseString(String str) {
        str = str.trim();
        int strl = str.length();
        if (strl > 1) {
            StringBuffer sb = new StringBuffer();
            for (int i = strl - 1; i >= 0; i--) {
                sb.append(str.charAt(i) + "");
            }
            return sb.toString();
        }
        return str;
    }
 
    //convert decimal to hex
    public String decToHex(String dec) {
        return binToHex(decToBin(dec));
    }
 
    //convert decimal to oct
    public String decToOct(String dec) {
        return binToOct(decToBin(dec));
    }
 
    //convert decimal to bin
    public String decToBin(String dec) {
        if (!isDecimal(dec)) {
            return "Invalid input!";
        }
        int val = Integer.parseInt(dec);
        if (val == 0) {
            return "0";
        }
        StringBuffer bin = new StringBuffer();
        for (; val != 1; val = val / 2) {
            bin.append((val % 2) + "");
        }
        bin.append("1");
        return reverseString(bin.toString());
    }
 
    //convert oct to decimal
    public String octToDec(String oct) {
        return binToDec(octToBin(oct));
    }
 
    //convert oct to hex
    public String octToHex(String oct) {
        return binToHex(octToBin(oct));
    }
 
    //convert oct to bin
    public String octToBin(String oct) {
        if (!isOctal(oct)) {
            return "Invalid input!";
        }
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < oct.length(); i++) {
            if (oct.charAt(i) == '0') {
                sb.append("000");
            } else if (oct.charAt(i) == '1') {
                sb.append("001");
            } else if (oct.charAt(i) == '2') {
                sb.append("010");
            } else if (oct.charAt(i) == '3') {
                sb.append("011");
            } else if (oct.charAt(i) == '4') {
                sb.append("100");
            } else if (oct.charAt(i) == '5') {
                sb.append("101");
            } else if (oct.charAt(i) == '6') {
                sb.append("110");
            } else if (oct.charAt(i) == '7') {
                sb.append("111");
            }
        }
        return Long.parseLong(sb.toString()) + "";
    }
 
    //convert hex to decimal
    public String hexToDec(String hex) {
        return binToDec(hexToBin(hex));
    }
 
    //convert hex to oct
    public String hexToOct(String hex) {
        return binToOct(hexToBin(hex));
    }
 
    //convert hex to bin
    public String hexToBin(String hex) {
        hex = hex.toUpperCase();
        if (!isHexaDecimal(hex)) {
            return "Invalid input!";
        }
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < hex.length(); i++) {
            if (hex.charAt(i) == '0') {
                sb.append("0000");
            } else if (hex.charAt(i) == '1') {
                sb.append("0001");
            } else if (hex.charAt(i) == '2') {
                sb.append("0010");
            } else if (hex.charAt(i) == '3') {
                sb.append("0011");
            } else if (hex.charAt(i) == '4') {
                sb.append("0100");
            } else if (hex.charAt(i) == '5') {
                sb.append("0101");
            } else if (hex.charAt(i) == '6') {
                sb.append("0110");
            } else if (hex.charAt(i) == '7') {
                sb.append("0111");
            } else if (hex.charAt(i) == '8') {
                sb.append("1000");
            } else if (hex.charAt(i) == '9') {
                sb.append("1001");
            } else if (hex.charAt(i) == 'A') {
                sb.append("1010");
            } else if (hex.charAt(i) == 'B') {
                sb.append("1011");
            } else if (hex.charAt(i) == 'C') {
                sb.append("1100");
            } else if (hex.charAt(i) == 'D') {
                sb.append("1101");
            } else if (hex.charAt(i) == 'E') {
                sb.append("1110");
            } else if (hex.charAt(i) == 'F') {
                sb.append("1111");
            }
        }
        return Long.parseLong(sb.toString()) + "";
    }
 
    //is input represents a Binary number
    public boolean isBinary(String bin) {
        return bin.matches("[0|1]+");
 
    }
 
    //is input represents a Octal number
    public boolean isOctal(String bin) {
        return bin.matches("[0-7]+");
 
    }
 
    //is input represents a Hexadecimal number
    public boolean isHexaDecimal(String bin) {
        return bin.toUpperCase().matches("[0-9|A-F]+");
 
    }
 
    //is input represents a decimal number
    public boolean isDecimal(String bin) {
        return bin.matches("[0-9]+");
 
    }
 
    //convert bin to decimal
    public String binToDec(String bin) {
        if (!isBinary(bin)) {
            return "Invalid input!";
        }
        int nOfDigits = bin.length();
        int val = 0;
        bin = reverseString(bin);
        for (int i = 0; i < nOfDigits; i++) {
            try {
                val = val + Integer.parseInt(bin.charAt(i) + "") * ((int) Math.pow(2, i));
            } catch (NumberFormatException nfe) {
                return "Invalid input!";
            }
        }
        return val + "";
    }
 
    //convert bin to oct
    public String binToOct(String bin) {
        if (!isBinary(bin)) {
            return "Invalid input!";
        }
        String[] tokens = splitByWidth(bin, 3, '0');
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < tokens.length; i++) {
            if (tokens[i].equals("000")) {
                sb.append("0");
            } else if (tokens[i].equals("001")) {
                sb.append("1");
            } else if (tokens[i].equals("010")) {
                sb.append("2");
            } else if (tokens[i].equals("011")) {
                sb.append("3");
            } else if (tokens[i].equals("100")) {
                sb.append("4");
            } else if (tokens[i].equals("101")) {
                sb.append("5");
            } else if (tokens[i].equals("110")) {
                sb.append("6");
            } else if (tokens[i].equals("111")) {
                sb.append("7");
            }
        }
        return sb.toString();
    }
 
    //convert bin to hex
    public String binToHex(String bin) {
        if (!isBinary(bin)) {
            return "Invalid input!";
        }
        String[] tokens = splitByWidth(bin, 4, '0');
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < tokens.length; i++) {
            if (tokens[i].equals("0000")) {
                sb.append("0");
            } else if (tokens[i].equals("0001")) {
                sb.append("1");
            } else if (tokens[i].equals("0010")) {
                sb.append("2");
            } else if (tokens[i].equals("0011")) {
                sb.append("3");
            } else if (tokens[i].equals("0100")) {
                sb.append("4");
            } else if (tokens[i].equals("0101")) {
                sb.append("5");
            } else if (tokens[i].equals("0110")) {
                sb.append("6");
            } else if (tokens[i].equals("0111")) {
                sb.append("7");
            } else if (tokens[i].equals("1000")) {
                sb.append("8");
            } else if (tokens[i].equals("1001")) {
                sb.append("9");
            } else if (tokens[i].equals("1010")) {
                sb.append("A");
            } else if (tokens[i].equals("1011")) {
                sb.append("B");
            } else if (tokens[i].equals("1100")) {
                sb.append("C");
            } else if (tokens[i].equals("1101")) {
                sb.append("D");
            } else if (tokens[i].equals("1110")) {
                sb.append("E");
            } else if (tokens[i].equals("1111")) {
                sb.append("F");
            }
        }
        return sb.toString();
    }
 
    //split string by specified width and fill empty spaces
    public String[] splitByWidth(String str, int width, char fillChar) {
        String[] list = null;
        int strLen = str.length();
        StringBuffer sb = new StringBuffer(reverseString(str));
        int mod = strLen % width;
        if (!(mod == 0)) {
            for (int i = 0; i < width - mod; i++) {
                sb.append(fillChar);
            }
        }
        strLen = sb.length();
        list = new String[strLen / width];
        sb = new StringBuffer(reverseString(sb.substring(0)));
        StringBuffer tmp = new StringBuffer();
        int listCounter = 0;
        for (int i = 0; i < strLen; i++) {
            if (i % width == 0 && i != 0) {
                list[listCounter] = tmp.toString();
                listCounter++;
                tmp = new StringBuffer();
            }
            tmp.append(sb.charAt(i));
        }
        list[listCounter] = tmp.toString();
        listCounter++;
        return list;
    }
}


Related Posts

  1. my batch Image Converter using java imageIO
  2. convert images using java imageIO
  3. add jFileChooserFilter to your java code
  4. html tokenizer
  5. get your computer name using c++, windows only
Print This Post