BCD码介绍

在有些协议场景中,有的字段要求传BCD码。
BCD码(Binary-Coded Decimal‎),也称二进制码十进制数或二-十进制代码。用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数字编码形式,用二进制编码的十进制代码。
BCD码可分为有权码和无权码两类。其中,常见的有权BCD码有8421码、2421码、5421码,无权BCD码有余3码、余3循环码、格雷码。8421 BCD码是最基本和最常用的BCD码,它和四位自然二进制码相似,各位的权值为8、4、2、1,故称为有权BCD码。
我们今天的java代码以8421码为例。
在这里插入图片描述

Java代码实现

定义一个类BcdCodeTransfer实现十进制字符串和BCD码的互转功能:

/**
 * 类中使用的BCD码是8421 BCD码
 * @author thb * 
 */
public class BcdCodeTransfer {
	
	/**
	 * 将BCD码转换为十进制的字符串。举例:
	 * 如果BCD码为00010010,转换后的十进制字符串为"12"
	 * 如果BCD码为00000010,转换后的十进制字符串为"2"
	 * 如果BCD码为00000001 00100011,转换后的十进制字符串为"123"
	 * @param bcd BCD码
	 * @return 十进制字符串
	 */
	public static String bcdToDecimalString(byte[] bcd) {

		StringBuffer sb = new StringBuffer();
		// 存放转化后的十进制数字的字符串
		String decStr;
		
		for (int i = 0; i < bcd.length; i++) {
			// 每个字节的前四位的值右移4位转化为十进制数
			sb.append((bcd[i] & 0XF0) >> 4);
			sb.append(bcd[i] & 0X0F);
		}
		
		// 如果转化后的字符串首字母为0,那么去掉
		if (sb.charAt(0) == '0') {
			decStr = sb.substring(1);
		}else {
			decStr = sb.toString();
		}
		
		return decStr;
	}
	
	/**
	 * 十进制字符串转BCD码。举例:
	 * 如果十进制字符串为"2",转换后的BCD码为00000010
	 * 如果十进制字符串为"12",转换后的BCD码为00010010
	 * 如果十进制字符串为"123",转换后的BCD码为00000001 00100011
	 * @param decStr 十进制字符串
	 * @return BCD码
	 * @throws Exception 
	 */
	public static byte[] decimalStringToBcd(String decStr) throws Exception {		 
		// 因为可能修改字符串的内容,所以构造StringBuffer
		StringBuffer sb = new StringBuffer(decStr);
		// 一个字节包含两个4位的BCD码,byte数组中要包含偶数个BCD码
		// 一个十进制字符对应4位BCD码,所以如果十进制字符串的长度是奇数,要在前面补一个0使长度成为偶数		
		if ((sb.length() % 2) != 0) {
			sb.insert(0, '0');  
		}		
		
		// 两个十进制数字转换为BCD码后占用一个字节,所以存放BCD码的字节数等于十进制字符串长度的一半
		byte[] bcd = new byte[sb.length() / 2];	
		for (int i = 0; i < sb.length();) {			
			if (!Character.isDigit(sb.charAt(i)) || !Character.isDigit(sb.charAt(i + 1))) {
				throw new Exception("传入的十进制字符串包含非数字字符!");
			}
			// 每个字节的构成:用两位十进制数字运算的和填充,高位十进制数字左移4位+低位十进制数字
			bcd[i/2] = (byte)((Character.digit(sb.charAt(i), 10) << 4) + Character.digit(sb.charAt(i + 1), 10));
			// 字符串的每两个字符取出来一起处理,所以此处i的自增长要加2,而不是加1
			i += 2;
		}
		return bcd;
	}
}

定义一个主类Test3来调用BcdCodeTransfer的函数进行验证:

	public static void main(String[] args) {
		String decStr = "12";
		System.out.println("decimal string: " + decStr);
		try {
			// 十进制字符串转BCD码
			byte[] bcd = BcdCodeTransfer.decimalStringToBcd(decStr);
			System.out.println("after transferring got BCD Code:");
			for (int i = 0; i < bcd.length; i++) {				
				System.out.println("byte " + i + ": " + Integer.toBinaryString(bcd[i]));
			}
			System.out.println("---------------------------------");
			
			// BCD码转十进制字符串
			System.out.println("after transferring got decimal string:");
			System.out.println(BcdCodeTransfer.bcdToDecimalString(bcd));
		} catch (Exception e) {			
			e.printStackTrace();
		}		

	}

}

输出:
在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐