Search code examples
javaarraysstringbcd

Algorithm to convert a String of decimal digits to BCD


I am looking a way to convert a string to BCD equivalent. I use Java, but it is not a question of the language indeed. I am trying to understand step by step how to convert a string to BCD.

For example, suppose I have the following string;

"0200" (This string has four ASCII characters, if we were in java this string had been contained in a byte[4] where byte[0] = 48, byte[1] = 50, byte[2] = 48 and byte[3] = 48)

In BCD (according this page: http://es.wikipedia.org/wiki/Decimal_codificado_en_binario):

0 = 0000
2 = 0010
0 = 0000
0 = 0000

Ok, I think the conversion is correct but I have to save this in a byte[2]. What Should I have to do? After, I have to read the BCD and convert it to the original string "0200" but first I have to resolve String to BCD.


Solution

  • Find a utility class to do this for you. Surely someone out there has written a BCD conversion utility for Java.

    Here you go. I Googled "BCD Java" and got this as the first result. Copying code here for future reference.

    public class BCD {
    
        /*
         * long number to bcd byte array e.g. 123 --> (0000) 0001 0010 0011
         * e.g. 12 ---> 0001 0010
         */
        public static byte[] DecToBCDArray(long num) {
            int digits = 0;
    
            long temp = num;
            while (temp != 0) {
                digits++;
                temp /= 10;
            }
    
            int byteLen = digits % 2 == 0 ? digits / 2 : (digits + 1) / 2;
            boolean isOdd = digits % 2 != 0;
    
            byte bcd[] = new byte[byteLen];
    
            for (int i = 0; i < digits; i++) {
                byte tmp = (byte) (num % 10);
    
                if (i == digits - 1 && isOdd)
                    bcd[i / 2] = tmp;
                else if (i % 2 == 0)
                    bcd[i / 2] = tmp;
                else {
                    byte foo = (byte) (tmp << 4);
                    bcd[i / 2] |= foo;
                }
    
                num /= 10;
            }
    
            for (int i = 0; i < byteLen / 2; i++) {
                byte tmp = bcd[i];
                bcd[i] = bcd[byteLen - i - 1];
                bcd[byteLen - i - 1] = tmp;
            }
    
            return bcd;
        }
    
        public static String BCDtoString(byte bcd) {
            StringBuffer sb = new StringBuffer();
    
            byte high = (byte) (bcd & 0xf0);
            high >>>= (byte) 4; 
            high = (byte) (high & 0x0f);
            byte low = (byte) (bcd & 0x0f);
    
            sb.append(high);
            sb.append(low);
    
            return sb.toString();
        }
    
        public static String BCDtoString(byte[] bcd) {
    
            StringBuffer sb = new StringBuffer();
    
            for (int i = 0; i < bcd.length; i++) {
                sb.append(BCDtoString(bcd[i]));
            }
    
            return sb.toString();
        }
    }
    

    There's also this question: Java code or lib to decode a binary-coded decimal (BCD) from a String.