zoukankan      html  css  js  c++  java
  • BCD工具类(8421)


    1、BCD介绍

    (1)BCD码(Binary-Coded Decimal)亦称二进码十进数。用4位二进制数来表示1位十进制数中的0~9这10个数码。用二进制编码的十进制代码。
    (2)BCD码可分为有权码和无权码两类:有权BCD码有8421码、2421码、5421码,其中8421码是最常用的;无权BCD码有余3码,余3循环码等。
    (3)BCD和十进制在线转换工具网站https://www.osgeo.cn/app/s3130

    2、BCDUtil

    涉及的方法strToBcd、ascToBcd、bcdToStr

    
    package com.test;
    
    /**
     * BCD 8421码
     */
    public class BCDUtil {
    
    
    	private BCDUtil(){};
    
    	/**
    	 * 字符串转BCD码
    	 * @param asc ASCII字符串
    	 * @return BCD
    	 */
    	public static byte[] strToBcd(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 >>= 1;
    		}
    		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;
    	}
    
    	/**
    	 * ASCII转BCD
    	 * @param ascii ASCII byte数组
    	 * @return BCD
    	 */
    	public static byte[] ascToBcd(byte[] ascii) {
    		return ascToBcd(ascii, ascii.length);
    	}
    
    	/**
    	 * ASCII转BCD
    	 * @param ascii ASCII byte数组
    	 * @param ascLength 长度
    	 * @return BCD
    	 */
    	public static byte[] ascToBcd(byte[] ascii, int ascLength) {
    		byte[] bcd = new byte[ascLength / 2];
    		int j = 0;
    		for (int i = 0; i < (ascLength + 1) / 2; i++) {
    			bcd[i] = ascToBcd(ascii[j++]);
    			bcd[i] = (byte) (((j >= ascLength) ? 0x00 : ascToBcd(ascii[j++])) + (bcd[i] << 4));
    		}
    		return bcd;
    	}
    
    	/**
    	 * BCD转ASCII字符串
    	 * @param bytes BCD byte数组
    	 * @return ASCII字符串
    	 */
    	public static String bcdToStr(byte[] bytes) {
    		char temp[] = new char[bytes.length * 2], val;
    
    		for (int i = 0; i < bytes.length; i++) {
    			val = (char) (((bytes[i] & 0xf0) >> 4) & 0x0f);
    			temp[i * 2] = (char) (val > 9 ? val + 'A' - 10 : val + '0');
    
    			val = (char) (bytes[i] & 0x0f);
    			temp[i * 2 + 1] = (char) (val > 9 ? val + 'A' - 10 : val + '0');
    		}
    		return new String(temp);
    	}
    
    
    	/**------------------------Private method start-------------------------**/
    	/**
    	 * 转换单个byte为BCD
    	 * @param asc ACSII
    	 * @return BCD
    	 */
    	private static byte ascToBcd(byte asc) {
    		byte bcd;
    
    		if ((asc >= '0') && (asc <= '9')) {
    			bcd = (byte) (asc - '0');
    		}else if ((asc >= 'A') && (asc <= 'F')) {
    			bcd = (byte) (asc - 'A' + 10);
    		}else if ((asc >= 'a') && (asc <= 'f')) {
    			bcd = (byte) (asc - 'a' + 10);
    		}else {
    			bcd = (byte) (asc - 48);
    		}
    		return bcd;
    	}
    
    }
    
    
  • 相关阅读:
    AntDesign(React)学习-15 组件定义、connect、interface
    js函数中不带e的阻止冒泡方法
    ext.net 修改store后强制更新
    给非input元素增加placeholder特性
    AntDesign(React)学习-14 使用UMI提供的antd模板
    认知:关于Android 调试的坑
    css 定位(fixed > absolute > relative)与层级zIndex 的权限认知
    echarts 通过dom获取echarts实例,批量监听reset
    阿里云 ssh 登陆请使用(公)ip
    Chrome 调试技巧: 调整网速
  • 原文地址:https://www.cnblogs.com/ranandrun/p/BCD.html
Copyright © 2011-2022 走看看