`

ASCII与BCD编码转换

 
阅读更多


package com.handpay.core.common.util;


public class BCDASCII {

	/**
	 * 字母'A'的ASCII编码值
	 */
	public final static byte ALPHA_A_ASCII_VALUE = 0x41;

	/**
	 * 字母'a'的ASCII编码值
	 */
	public final static byte ALPHA_a_ASCII_VALUE = 0x61;

	/**
	 * 数字'0'的ASCII编码值
	 */
	public final static byte DIGITAL_0_ASCII_VALUE = 0x30;

	private BCDASCII() {
	}

	/**
	 * 从BCD编码转换成ASCII编码.
	 * @param bcdBuf, BCD编码缓冲区
	 * @param bcdOffset, BCD编码缓冲区起始偏移
	 * @param asciiBuf, ASCII编码缓冲区
	 * @param asciiOffset, ASCII编码缓冲区的起始偏移
	 * @param asciiLen, 采用ASCII编码时的信息长度
	 * @param rightAlign, 奇数个ASCII码时采用的右对齐方式标志
	 * @return, ASCII编码缓冲区
	 */
	public static void fromBCDToASCII(byte[] bcdBuf, int bcdOffset, byte[] asciiBuf, int asciiOffset, int asciiLen,
			boolean rightAlignFlag) {
		int cnt;

		if (((asciiLen & 1) == 1) && rightAlignFlag) {
			cnt = 1;
			asciiLen++;
		} else
			cnt = 0;

		for (; cnt < asciiLen; cnt++, asciiOffset++) {
			asciiBuf[asciiOffset] = (byte) ((((cnt) & 1) == 1) ? (bcdBuf[bcdOffset++] & 0x0f)
					: ((bcdBuf[bcdOffset] >> 4) & 0x0f));
			asciiBuf[asciiOffset] = (byte) (asciiBuf[asciiOffset] + ((asciiBuf[asciiOffset] > 9) ? (ALPHA_A_ASCII_VALUE - 10)
					: DIGITAL_0_ASCII_VALUE));
		}
	}

	/**
	 * 从BCD编码转换成ASCII编码.
	 * @param bcdBuf, BCD编码缓冲区
	 * @param asciiLen, 统一采用ASCII编码时的信息长度
	 * @param rightAlignFlag, 奇数个ASCII码时采用的右对齐方式标志
	 * @return, ASCII编码缓冲区
	 */
	public static byte[] fromBCDToASCII(byte[] bcdBuf, int bcdOffset, int asciiLen, boolean rightAlignFlag) {
		byte[] asciiBuf = new byte[asciiLen];
		fromBCDToASCII(bcdBuf, bcdOffset, asciiBuf, 0, asciiLen, rightAlignFlag);

		return asciiBuf;
	}

	public static String fromBCDToASCIIString(byte[] bcdBuf, int bcdOffset, int asciiLen, boolean rightAlignFlag) {
		try {
			return new String(fromBCDToASCII(bcdBuf, bcdOffset, asciiLen, rightAlignFlag), "GBK");
		} catch (Exception e) {
			throw new RuntimeException(e.getMessage(), e);
		}
	}

	/**
	 * 从ASCII编码转换成BCD编码.
	 * @param asciiBuf, ASCII编码缓冲区
	 * @param asciiOffset, ASCII编码缓冲区的起始偏移
	 * @param asciiLen, 采用ASCII编码时的信息长度
	 * @param bcdBuf, BCD编码缓冲区
	 * @param bcdOffset, BCD编码缓冲区起始偏移
	 * @param rightAlignFlag, 奇数个ASCII码时采用的右对齐方式标志
	 */
	public static void fromASCIIToBCD(byte[] asciiBuf, int asciiOffset, int asciiLen, byte[] bcdBuf, int bcdOffset,
			boolean rightAlignFlag) {
		int cnt;
		byte ch, ch1;

		if (((asciiLen & 1) == 1) && rightAlignFlag) {
			ch1 = 0;
		} else {
			ch1 = 0x55;
		}

		for (cnt = 0; cnt < asciiLen; cnt++, asciiOffset++) {
			if (asciiBuf[asciiOffset] >= ALPHA_a_ASCII_VALUE)
				ch = (byte) (asciiBuf[asciiOffset] - ALPHA_a_ASCII_VALUE + 10);
			else if (asciiBuf[asciiOffset] >= ALPHA_A_ASCII_VALUE)
				ch = (byte) (asciiBuf[asciiOffset] - ALPHA_A_ASCII_VALUE + 10);
			else if (asciiBuf[asciiOffset] >= DIGITAL_0_ASCII_VALUE)
				ch = (byte) (asciiBuf[asciiOffset] - DIGITAL_0_ASCII_VALUE);
			else
				ch = 0x00;

			if (ch1 == 0x55)
				ch1 = ch;
			else {
				bcdBuf[bcdOffset] = (byte) (ch1 << 4 | ch);
				bcdOffset++;
				ch1 = 0x55;
			}
		}

		if (ch1 != 0x55)
			bcdBuf[bcdOffset] = (byte) (ch1 << 4);
	}

	public static void fromASCIIToBCD(String asciiStr, int asciiOffset, int asciiLen, byte[] bcdBuf, int bcdOffset,
			boolean rightAlignFlag) {
		try {
			byte[] asciiBuf = asciiStr.getBytes("GBK");
			fromASCIIToBCD(asciiBuf, asciiOffset, asciiLen, bcdBuf, bcdOffset, rightAlignFlag);
		} catch (Exception e) {
			throw new RuntimeException(e.getMessage(), e);
		}
	}
	
	/**
	 * 从ASCII编码转换成BCD编码.
	 * @param asciiBuf, ASCII编码缓冲区
	 * @param asciiOffset, ASCII编码缓冲区的起始偏移
	 * @param asciiLen, 统一采用ASCII编码时的信息长度
	 * @param rightAlignFlag, 奇数个ASCII码时采用的右对齐方式标志
	 * @return, BCD编码缓冲区
	 */
	public static byte[] fromASCIIToBCD(byte[] asciiBuf, int asciiOffset, int asciiLen, boolean rightAlignFlag) {
		byte[] bcdBuf = new byte[(asciiLen + 1) / 2];
		fromASCIIToBCD(asciiBuf, asciiOffset, asciiLen, bcdBuf, 0, rightAlignFlag);

		return bcdBuf;
	}

	public static byte[] fromASCIIToBCD(String asciiStr, int asciiOffset, int asciiLen, boolean rightAlignFlag) {
		try {
			byte[] asciiBuf = asciiStr.getBytes("GBK");
			return fromASCIIToBCD(asciiBuf, asciiOffset, asciiLen, rightAlignFlag);
		} catch (Exception e) {
			throw new RuntimeException(e.getMessage(), e);
		}
	}
}
分享到:
评论

相关推荐

    JAVA二进制字节数组字符十六进制BCD编码转换.doc

    JAVA二进制字节数组字符十六进制BCD编码转换

    C++如何实现BCD码和ASCII码的相互转换

    BCD  即BCD代码。Binary-Coded Decimal‎,简称BCD,称BCD码或二-十进制代码,亦称二进码十进数。...此外,对于其他需要高精确度的计算,BCD编码亦很常用。 ASCII ASCII(American Standard Code for In

    Tools Box程序员日常常用算法集成工具箱

    包括大小字母转换、时间戳转换、ASCII和BCD互相转换、BCD到无符号长整型数互相转换、基本异或操作、CRC算法、MD5、SHA1、SHA224、SHA256、SHA384、SHA512、DES/3DES、MAC算法、RSA算法、SM算法:SM2/SM3/SM4、中文到...

    全国计算机应用基础知识:汉字、字符编码.pdf

    表1-4 BCD码与⼗进制数的对应关系 Unicode编码 ASCII码提供了128个字符,扩展的ASC码提供了256个字符,但⽤来表⽰世界各国的⽂字编码还显得不够,还需要表⽰更多的字符和意义,因 此⼜出现了Unicode编码。...

    各种码制转换小工具

    这个一个 小巧的各种码制转换小工具, 可以实现,ASCII 码查询,整数的,2进制,8进制,10进制,16进制之间互相转换, 硬编码 BCD码,GRAY码,BIN自然码之间的互相转换; 转换的同时可以实现2,8,10,16进制格式显示; 适用与串口...

    逻辑与计算机设计基础学习复习要点

    浙江大学 逻辑与计算机设计基础 学习复习要点 共9章,分列了要点。 第一章 数字计算机与信息 1. 数字系统:数字信号,...十进制数的二进制编码:BCD码 字符编码:ASCII 5. 各种信息的编码 第二章 组合逻辑电路 。。。

    单片机---文本教案

    第一章 单片微型计算机概述 教学内容: 1.1、单片微型计算机发展概况...6、熟悉BCD 码和ASCII 码 教学重点: 1、单片机的含义及作用 2、补码的概念及运算 3、BCD 码及ASCII 码 教学难点: 1、数制间的转换 2、补码的运算

    单片机原理与接口技术-单片机教程.doc

    "授课日期 " 第 1 周 星期 三 第 1-2 "教学用时 "2 学时 " " "节 " " " "教学内容 "数制、编码 " "(学习情境 " " ") " " "教学目的 "掌握二进制、十六进制数的转换和BCD、ASCII码 " "及要求 " " "教学重点 " 进制...

    微型计算机原理及应用教案

    把十进制数转换为其等值的二进制数称之为BCD编码(如表1.1所示)。 表1.1 BCD码与其它数制的对应关系 根据上述说明,一个十进制数,能够很方便地用BCD码来表示。例如,十进制数859用BCD码...

    单片机系统设计课程实验二单片机与PC机通信实验实验目.docx

    单片机系统设计课程实验二 51单片机与PC机通信实验 实验目的 熟悉51单片机串口功能控制,同时掌握ASCII码的编码方法、16进制数与BCD码之间的转换。 实验内容 设定单片机串口为工作模式1,波特率为9600,数据位8位,...

    微机实验报告(1).docx

    掌握不同进程数及编码相互转换的程序设计方法,加深对数码转换的理解; 2.进一步熟悉键盘使用方法; 3. 进一步熟悉调试程序的方法 二. 实验设备 装有汇编软件的IBMPC 机一台 实验内容 将ASCII码表示的十进制数转换...

    [详细完整版]4单片机.doc

    计算机中最常用的字符信息编码是( A ) A ASCII B BCD码 C 余3码 D 循环码 2.要MCS-51系统中,若晶振频率屡8MHz,一个机器周期等于(A ) μs A 1.5 B 3 C 1 D 0.5 3.MCS-51的时钟最高频率是 ( A ). A 12MHz B 6 MHz...

    计算机应用基础试题及答案.doc

    2、在微型计算机中,应用最普遍的字符编码是 A) ASCII码 B)BCD码 C)汉字编码 D)补码 3、计算机病毒可以使整个计算机瘫痪,危害极大。计算机病毒是 A) 一条命令 B)一段特殊的程序 C)一种生物病毒 D)一种芯片 4...

    (完整版)计算机应用基础试题及答案.doc

    2、在微型计算机中,应用最普遍的字符编码是 A) ASCII码 B)BCD码 C)汉字编码 D)补码 3、计算机病毒可以使整个计算机瘫痪,危害极大。计算机病毒是 A) 一条命令 B)一段特殊的程序 C)一种生物病毒 D)一种芯片 4、...

    新编MCS-51单片机应用设计(清晰最新版)

    14.7.1 二进制码与ASCII码的转换 14.7.2 二进制码到BCD码的转换 14.7.3 BCD码到二进制码的转换 14.8 数字滤波 14.8.1 算术平均值法 14.8.2 滑动平均值法 14.8.3 防脉冲干扰平均值法 第15章 MCS—51应用系统设计、...

    单片机原理与控制技术 第2版

    单片机原理与控制技术 第2版 第1章 微型计算机系统基本知识 本章要点: 微型计算机和单片机的发展概况 单片机系统组成概述(CPU、总线、存储器和I/O口等) 二进制、十进制和十六... 单片机常用编码(BCD码、ASCII码)

    text_converter:向您的朋友发送最特殊的文字和神秘的文字(android)

    ASCII编码器/解码器 二进制编码器/解码器(a-&gt; 01100001) 十六进制编码器/解码器 八进制编码器/解码器 反向文本(abc def-&gt; fed cba)编码器/解码器 大写文本(abc-&gt; ABC)编码器/解码器 小写文本(ABC-&gt; abc)...

    微机原理与接口技术复习指导

    微机原理与接口技术复习指导 第1章绪论 1,了解微机系统组成及基本工作原理; 2,熟悉数制及其转换方法; 3,熟悉二进制数的加减运算和...码、BCD数、ASCII码)及其数值范围; 5,熟悉补码的运算规则及溢出的判断方法。

    单片机原理及应用课程标准.pdf

    (4)了解 BCD 码的编码方法、转换关系和加减法运算时的修正方法;了解 ASCII 码 和查表换算的方法。 (5)了解单片机应用系统的开发过程和研发工具(Proteus、keil 软件) 。 【教学重点】 单片机开发的一般过程。...

    单片机原理及应用课程标准(1).doc

    了解BCD码的编码方法、转换关系和加减法运算时的修正方法;了解ASCII码和查表换算 的方法。 了解单片机应用系统的开发过程和研发工具(Proteus、keil 软件)。 【教学重点】 单片机开发的一般过程。 【教学难点】 ...

Global site tag (gtag.js) - Google Analytics