/**
* BCD和ASCII转换工具类.
*
* @author xu.wei .
*/
public class BCDASCII {
/**
* 默认编码.
*/
private static final String ENCODING = "UTF-8";
/**
* 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
* 位移
* @param asciiBuf
* ascii字节
* @param asciiOffset
* 位移
* @param asciiLen
* 长度
* @param rightAlignFlag
* 右对齐
*/
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 bcdOffset
* 位移
* @param asciiLen
* ascii长度
* @param rightAlignFlag
* 右对齐
* @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;
}
/**
* BCD转成ASCII .
*
* @param bcdBuf
* bcd字节
* @param bcdOffset
* 位移
* @param asciiLen
* ascii长度
* @param rightAlignFlag
* 右对齐
* @return ascii字符串
*/
public static String fromBCDToASCIIString(byte[] bcdBuf, int bcdOffset,
int asciiLen, boolean rightAlignFlag) {
try {
return new String(fromBCDToASCII(bcdBuf, bcdOffset, asciiLen,
rightAlignFlag), ENCODING);
} 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
* 是否右对齐
*/
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);
}
/**
* ASCII转成BCD .
*
* @param asciiStr
* ascii字符串
* @param asciiOffset
* ascii位移
* @param asciiLen
* ascii长度
* @param bcdBuf
* bcd字节
* @param bcdOffset
* bcd位移
* @param rightAlignFlag
* 是否右对齐
*/
public static void fromASCIIToBCD(String asciiStr, int asciiOffset,
int asciiLen, byte[] bcdBuf, int bcdOffset, boolean rightAlignFlag) {
try {
byte[] asciiBuf = asciiStr.getBytes(ENCODING);
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
* 是否右对齐
* @return ascii字节
*/
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;
}
/**
* ASCII转成BCD .
*
* @param asciiStr
* ascii字符串
* @param asciiOffset
* ascii位移
* @param asciiLen
* ascii长度
* @param rightAlignFlag
* 是否右对齐
* @return ascii字符串
*/
public static byte[] fromASCIIToBCD(String asciiStr, int asciiOffset,
int asciiLen, boolean rightAlignFlag) {
try {
byte[] asciiBuf = asciiStr.getBytes(ENCODING);
return fromASCIIToBCD(asciiBuf, asciiOffset, asciiLen,
rightAlignFlag);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
}