`

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);
		}
	}
}
分享到:
评论

相关推荐

    BCD_ASCII转换工具

    本文将深入探讨BCD码与ASCII码的原理、转换方法以及应用。 首先,让我们了解一下BCD码。BCD码是一种将十进制数用二进制形式表示的方法,旨在简化十进制数值的计算机处理。最常见的BCD码是4位二进制表示一位十进制数...

    ascii-bcd.rar_ASCII BCD_ASCII BCD_BCD ASCII_ascii 转换_bcd

    题目中的“ascii-bcd.rar”是一个压缩包文件,显然包含了与ASCII码到BCD码转换相关的资源。在汇编语言编程中,转换过程通常涉及到一系列的逻辑操作和移位。汇编语言是一种低级语言,直接对应于机器指令,对于这种...

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

    在Java编程中,二进制、字节数组、字符、十六进制和BCD(Binary-Coded Decimal,二进制编码的十进制)编码转换是常见的数据处理任务。以下将详细介绍这些概念以及如何在Java中进行相关操作。 1. **二进制与十六进制...

    GBK编码转换汉字,汉字转换GBK编码,VC代码实现

    接下来,我们讨论BCD编码和ASCII编码的转换。BCD编码主要用于存储和传输数字,每个数字用两个字节表示。ASCII编码则是一种单字节编码,包含基本的拉丁字母、数字和一些特殊字符。在VC++中,我们可以自定义函数来实现...

    十进制二进制ASCIIBCD码转换工具

    有多种BCD编码方法,如8421编码、5421编码等,其中8421是最常见的,每一位二进制对应十进制数的权重分别是8、4、2和1。 在实际应用中,十进制、二进制、ASCII和BCD码之间的转换常常是必要的。例如,当我们需要在...

    bcd2asc_demo.rar_BCD ASC_BCD 转 ASC||_bcd2asc_bcd码变asc码_bcd码转换asc

    标签中的“bcd_asc”、“bcd_转_asc”、“bcd2asc”等关键词进一步明确了这个程序的核心功能——将BCD编码的数据转换成ASCII编码。这可能涉及到解析BCD码,将其转换为相应的十进制数,然后再转换为ASCII字符。 ...

    BCD关于BCD码在PLC数据转换

    4. **BCD与ASCII码的转换**:在需要与人机界面(HMI)交互时,BCD码可能需要转换为ASCII码以便显示,反之亦然。 **四、BCD码的优缺点** 优点: - 提供精确的十进制数字表示。 - 适合处理金融和计量数据。 - 简化与...

    日期时间转换成ASC码或者BCD码

    在实际应用中,日期和时间的转换与校验是串口通信中不可或缺的部分,特别是在工业自动化、物联网设备和嵌入式系统中。开发者需要理解ASCII码和BCD码的原理,以及如何在实际项目中应用它们,以确保数据的准确传输和...

    软件实验二二进制到ASCII码转换定义.pdf

    本资源摘要信息涵盖了软件实验二二进制到ASCII码转换定义的相关知识点,旨在帮助学生了解BCD值和ASCII值的区别、如何将BCD值转换成ASCII值、如何查表进行数值转换及快速计算等。 一、实验要求 实验要求给出一个BCD...

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

    `ASCII2BCD`函数将ASCII码转换为BCD码,而`BCD2ASCII`函数将BCD码转换为ASCII码。 在`ASCII2BCD`函数中,我们首先检查输入字符串的长度是否为偶数,如果不是,则在字符串的开头添加一个零。然后,我们使用`sscanf`...

    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、中文到...

    BCD码 基础知识

    在编程中,我们可以使用函数来实现 BCD 码与 ASCII 码之间的转换。例如,下面是一个使用 C 语言实现的 BCD 码到 ASCII 码的转换函数: void BcdToAscii (char *ascii_buf, const BYTE *bcd_buf, int len){ int i; ...

    用C与越南实现码制转换

    本文将详细讨论如何使用C语言进行十六进制、BCD(Binary-Coded Decimal,二进制编码的十进制)以及十进制之间的转换。 首先,让我们分析提供的代码片段。代码中包含了三个主要的函数: 1. `DectoHex`:这是一个将...

    单片机实验上机--实验三 二进制ASCII码转换.doc

    实验三“二进制ASCII码转换”是单片机学习中的一个重要实践环节,旨在帮助学生理解和掌握数值在BCD码和ASCII码之间的转换方法。在这个实验中,主要的知识点包括: 1. **BCD码(Binary-Coded Decimal)**:BCD码是一...

    CNV.rar_Enjoy_To Ascii_ascii to hex_from hex_hex

    "CNV.rar_Enjoy_To Ascii_ascii to hex_from hex_hex"这个压缩包文件的主题聚焦于ASCII与十六进制(Hex)之间的转换,以及可能涉及的其他相关转换,如十六进制到BCD(二进制编码的十进制)。让我们深入探讨这些概念...

    数码转换实验报告

    例如,从ASCⅡ码转换为非压缩型BCD码的过程中,可能需要将ASCII码减去30H(即十进制的48,ASCII码中'0'的值)以得到十进制数值,然后判断是否在0-9范围内。BCD码到二进制的转换则需要将BCD码的每一位拆分出来,分别...

    代码转换.zip

    在IT领域,编码转换是一项基础且重要的任务,特别是在数据处理、通信协议和存储系统中。这里,我们将深入探讨与"代码转换.zip"相关的各种转换,包括双字节十六进制与双字节BCD码之间的转换,单字节BCD码与单字节十六...

    HEX TO BCD

    #### 一、HEX(十六进制)与BCD(二进制编码十进制)简介 在数字电子系统和计算机编程领域中,经常需要进行不同数值表示方法之间的转换。其中两种常见的数值表示方式是十六进制(HEX)和二进制编码十进制(BCD)。 - *...

    微机上机实验报告(广工实验报告+截图)

    ASCII码与BCD码转换 - **ASCII码**:一种标准的字符编码方案,用于表示字母、数字和特殊字符。 - **BCD码**:一种二进制编码的十进制数表示方法,通常用于计算器和计算机系统中进行十进制数的处理。 #### 2. 非...

Global site tag (gtag.js) - Google Analytics