Java實現BCD編碼與十進位制轉換

獵手家園發表於2022-08-22

1、BCD碼介紹

  • BCD碼(Binary-Coded Decimal‎)亦稱二進碼十進數或二-十進位制程式碼。用4位二進位制數來表示1位十進位制數中的0~9這10個數碼。是一種二進位制的數字編碼形式,用二進位制編碼的十進位制程式碼。BCD碼這種編碼形式利用了四個位元來儲存一個十進位制的數碼,使二進位制和十進位制之間的轉換得以快捷的進行。這種編碼技巧最常用於會計系統的設計裡,因為會計制度經常需要對很長的數字串作準確的計算。相對於一般的浮點式記數法,採用BCD碼,既可儲存數值的精確度,又可免卻使電腦作浮點運算時所耗費的時間。此外,對於其他需要高精確度的計算,BCD編碼亦很常用。
  • BCD碼是四位二進位制碼, 也就是將十進位制的數字轉化為二進位制, 但是和普通的轉化有一點不同, 每一個十進位制的數字0-9都對應著一個四位的二進位制碼,對應關係如下: 十進位制0 對應 二進位制0000 ;十進位制1 對應二進位制0001 ....... 9 1001 接下來的10就有兩個上述的碼來表示 10 表示為00010000 也就是BCD碼是遇見1001就產生進位,不象普通的二進位制碼,到1111才產生進位10000
  • 在Java通訊應用中,往往我們接收到資料流,而流是BCD編碼後的。因此我們要轉碼來獲得我們想要的十進位制資料。

 

2、常見BCD碼

 

3、JAVA實現

/** 
 * 編碼工具類 
 *  
 * @author 崔素強 
 * @see BCD與十進位制的轉換 
 */  
public class BCDDecode {  
    /** 
     * @功能:測試用例 
     * @引數: 引數 
     */  
    public static void main(String[] args) {  
        byte[] b = str2Bcd("2010");  
        System.out.println(bcd2Str(b));  
    }  
  
    /** 
     * @功能: BCD碼轉為10進位制串(阿拉伯資料) 
     * @引數: BCD碼 
     * @結果: 10進位制串 
     */  
    public static String bcd2Str(byte[] bytes) {  
        StringBuffer temp = new StringBuffer(bytes.length * 2);  
        for (int i = 0; i < bytes.length; i++) {  
            temp.append((byte) ((bytes[i] & 0xf0) >>> 4));  
            temp.append((byte) (bytes[i] & 0x0f));  
        }  
        return temp.toString().substring(0, 1).equalsIgnoreCase("0") ? temp  
                .toString().substring(1) : temp.toString();  
    }  
  
    /** 
     * @功能: 10進位制串轉為BCD碼 
     * @引數: 10進位制串 
     * @結果: BCD碼 
     */  
    public static byte[] str2Bcd(String asc) {  
        int len = asc.length();  
        int mod = len % 2;  
        if (mod != 0) {  
            asc = "0" + asc;  
            len = asc.length();  
        }  
        byte abt[] = new byte[len];  
        if (len >= 2) {  
            len = len / 2;  
        }  
        byte bbt[] = new byte[len];  
        abt = asc.getBytes();  
        int j, k;  
        for (int p = 0; p < asc.length() / 2; p++) {  
            if ((abt[2 * p] >= '0') && (abt[2 * p] <= '9')) {  
                j = abt[2 * p] - '0';  
            } else if ((abt[2 * p] >= 'a') && (abt[2 * p] <= 'z')) {  
                j = abt[2 * p] - 'a' + 0x0a;  
            } else {  
                j = abt[2 * p] - 'A' + 0x0a;  
            }  
            if ((abt[2 * p + 1] >= '0') && (abt[2 * p + 1] <= '9')) {  
                k = abt[2 * p + 1] - '0';  
            } else if ((abt[2 * p + 1] >= 'a') && (abt[2 * p + 1] <= 'z')) {  
                k = abt[2 * p + 1] - 'a' + 0x0a;  
            } else {  
                k = abt[2 * p + 1] - 'A' + 0x0a;  
            }  
            int a = (j << 4) + k;  
            byte b = (byte) a;  
            bbt[p] = b;  
        }  
        return bbt;  
    }  
}  

 

原文連結:https://blog.csdn.net/boonya/article/details/83537827

 

相關文章