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