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);
}
}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值