关于BCD编码 BCD与十进制转换


转自:http://cuisuqiang.iteye.com/blog/1429956


  • 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编码后的。因此我们要转码来获得我们想要的十进制数据。下面的代码是BCD编码的数据流与十进制的转换,仅供参考。
Java代码   收藏代码
  1. package com.util;  
  2.   
  3. /** 
  4.  * 编码工具类 
  5.  *  
  6.  * @author 崔素强 
  7.  * @see BCD与十进制的转换 
  8.  */  
  9. public class BCDDecode {  
  10.     /** 
  11.      * @功能:测试用例 
  12.      * @参数: 参数 
  13.      */  
  14.     public static void main(String[] args) {  
  15.         byte[] b = str2Bcd("2010");  
  16.         System.out.println(bcd2Str(b));  
  17.     }  
  18.   
  19.     /** 
  20.      * @功能: BCD码转为10进制串(阿拉伯数据) 
  21.      * @参数: BCD码 
  22.      * @结果: 10进制串 
  23.      */  
  24.     public static String bcd2Str(byte[] bytes) {  
  25.         StringBuffer temp = new StringBuffer(bytes.length * 2);  
  26.         for (int i = 0; i < bytes.length; i++) {  
  27.             temp.append((byte) ((bytes[i] & 0xf0) >>> 4));  
  28.             temp.append((byte) (bytes[i] & 0x0f));  
  29.         }  
  30.         return temp.toString().substring(01).equalsIgnoreCase("0") ? temp  
  31.                 .toString().substring(1) : temp.toString();  
  32.     }  
  33.   
  34.     /** 
  35.      * @功能: 10进制串转为BCD码 
  36.      * @参数: 10进制串 
  37.      * @结果: BCD码 
  38.      */  
  39.     public static byte[] str2Bcd(String asc) {  
  40.         int len = asc.length();  
  41.         int mod = len % 2;  
  42.         if (mod != 0) {  
  43.             asc = "0" + asc;  
  44.             len = asc.length();  
  45.         }  
  46.         byte abt[] = new byte[len];  
  47.         if (len >= 2) {  
  48.             len = len / 2;  
  49.         }  
  50.         byte bbt[] = new byte[len];  
  51.         abt = asc.getBytes();  
  52.         int j, k;  
  53.         for (int p = 0; p < asc.length() / 2; p++) {  
  54.             if ((abt[2 * p] >= '0') && (abt[2 * p] <= '9')) {  
  55.                 j = abt[2 * p] - '0';  
  56.             } else if ((abt[2 * p] >= 'a') && (abt[2 * p] <= 'z')) {  
  57.                 j = abt[2 * p] - 'a' + 0x0a;  
  58.             } else {  
  59.                 j = abt[2 * p] - 'A' + 0x0a;  
  60.             }  
  61.             if ((abt[2 * p + 1] >= '0') && (abt[2 * p + 1] <= '9')) {  
  62.                 k = abt[2 * p + 1] - '0';  
  63.             } else if ((abt[2 * p + 1] >= 'a') && (abt[2 * p + 1] <= 'z')) {  
  64.                 k = abt[2 * p + 1] - 'a' + 0x0a;  
  65.             } else {  
  66.                 k = abt[2 * p + 1] - 'A' + 0x0a;  
  67.             }  
  68.             int a = (j << 4) + k;  
  69.             byte b = (byte) a;  
  70.             bbt[p] = b;  
  71.         }  
  72.         return bbt;  
  73.     }  
  74. }  

 


你可能感兴趣的:(关于BCD编码 BCD与十进制转换)