package com.dy.common.util;
|
|
/**
|
* @Author: liurunyu
|
* @Date: 2024/7/27 15:50
|
* @Description
|
*/
|
public class BCDUtil {
|
|
/**
|
*
|
* @param num
|
* @return
|
*/
|
public static byte[] int2BCD_LE(int num){
|
int len = (int) Math.log10(num) + 1 ;
|
byte[] bs = null ;
|
if(len % 2 == 0){
|
bs = new byte[len / 2] ;
|
}else{
|
bs = new byte[len / 2 + 1] ;
|
}
|
int index = 0 ;
|
while(num > 0){
|
int yu = num % 100 ;
|
bs[index++] = (byte)(((yu/10) << 4) + (yu%10)) ;
|
num = num / 100 ;
|
}
|
return bs ;
|
}
|
|
/**
|
*
|
* @param num
|
* @return
|
*/
|
public static byte[] int2BCD_BE(int num){
|
int len = (int) Math.log10(num) + 1 ;
|
byte[] bs = null ;
|
if(len % 2 == 0){
|
bs = new byte[len / 2] ;
|
}else{
|
bs = new byte[len / 2 + 1] ;
|
}
|
int index = bs.length - 1 ;
|
while(num > 0){
|
int yu = num % 100 ;
|
bs[index--] = (byte)(((yu/10) << 4) + (yu%10)) ;
|
num = num / 100 ;
|
}
|
return bs ;
|
}
|
|
/**
|
*
|
* @param num
|
* @return
|
*/
|
public static byte[] long2BCD_LE(long num){
|
int len = (int) Math.log10(num) + 1 ;
|
byte[] bs = null ;
|
if(len % 2 == 0){
|
bs = new byte[len / 2] ;
|
}else{
|
bs = new byte[len / 2 + 1] ;
|
}
|
int index = 0 ;
|
while(num > 0){
|
long yu = num % 100 ;
|
bs[index++] = (byte)(((yu/10) << 4) + (yu%10)) ;
|
num = num / 100 ;
|
}
|
return bs ;
|
}
|
|
/**
|
*
|
* @param num
|
* @return
|
*/
|
public static byte[] long2BCD_BE(long num){
|
int len = (int) Math.log10(num) + 1 ;
|
byte[] bs = null ;
|
if(len % 2 == 0){
|
bs = new byte[len / 2] ;
|
}else{
|
bs = new byte[len / 2 + 1] ;
|
}
|
int index = bs.length - 1 ;
|
while(num > 0){
|
long yu = num % 100 ;
|
bs[index--] = (byte)(((yu/10) << 4) + (yu%10)) ;
|
num = num / 100 ;
|
}
|
return bs ;
|
}
|
|
/**
|
*
|
* @param numStr
|
* @return
|
*/
|
public static byte[] string2BCD_LE(String numStr) throws Exception{
|
if (numStr == null || !numStr.matches("\\d*")) {
|
throw new Exception("数字转成BCD编码时出错,不是合法数字:" + numStr, null);
|
}
|
int numLen = numStr.length() ;
|
int byteLen = 0 ;
|
if(numLen % 2 == 0){
|
byteLen = numLen / 2 ;
|
}else{
|
byteLen = numLen / 2 + 1 ;
|
}
|
|
int[] tmpInts = new int[byteLen * 2];
|
int index = numStr.length() - 1;
|
for (int i = 0; i <= tmpInts.length - 1 && index >= 0; i++, index--) {
|
tmpInts[i] = numStr.charAt(index) - '0';
|
}
|
byte[] bs = new byte[byteLen] ;
|
for (int i = 0, j = 0; i < byteLen; i++, j++) {
|
bs[i] = (byte) (tmpInts[2 * j + 1] * 16 + tmpInts[2 * j]);
|
}
|
|
return bs ;
|
}
|
|
/**
|
*
|
* @param numStr
|
* @return
|
*/
|
public static byte[] string2BCD_BE(String numStr) throws Exception{
|
if (numStr == null || !numStr.matches("\\d*")) {
|
throw new Exception("数字转成BCD编码时出错,不是合法数字:" + numStr, null);
|
}
|
int numLen = numStr.length() ;
|
int byteLen = 0 ;
|
if(numLen % 2 == 0){
|
byteLen = numLen / 2 ;
|
}else{
|
byteLen = numLen / 2 + 1 ;
|
}
|
|
int[] tmpInts = new int[byteLen * 2];
|
int index = numStr.length() - 1;
|
for (int i = tmpInts.length - 1; i >= 0 && index >= 0; i--, index--) {
|
tmpInts[i] = numStr.charAt(index) - '0';
|
}
|
byte[] bs = new byte[byteLen] ;
|
for (int i = 0, j = 0; i < byteLen; i++, j++) {
|
bs[i] = (byte) (tmpInts[2 * j] * 16 + tmpInts[2 * j + 1]);
|
}
|
|
return bs ;
|
}
|
|
/**
|
*
|
* @param bs
|
* @return
|
*/
|
public static int BCD2Int_LE(byte[] bs){
|
int num = 0 ;
|
int multiple = 1 ;
|
for(int i = 0; i < bs.length; i++){
|
num += (((bs[i] >> 4) * 10) + (bs[i] & 0xF)) * multiple ;
|
multiple = multiple * 100 ;
|
}
|
return num ;
|
}
|
|
/**
|
*
|
* @param bs
|
* @return
|
*/
|
public static int BCD2Int_BE(byte[] bs){
|
int num = 0 ;
|
int multiple = 1 ;
|
for(int i = bs.length-1; i >= 0 ; i--){
|
num += (((bs[i] >> 4) * 10) + (bs[i] & 0xF)) * multiple ;
|
multiple = multiple * 100 ;
|
}
|
return num ;
|
}
|
|
/**
|
*
|
* @param bs
|
* @return
|
*/
|
public static long BCD2Long_LE(byte[] bs){
|
long num = 0 ;
|
long multiple = 1 ;
|
for(int i = 0; i < bs.length; i++){
|
num += (((bs[i] >> 4) * 10) + (bs[i] & 0xF)) * multiple ;
|
multiple = multiple * 100 ;
|
}
|
return num ;
|
}
|
|
/**
|
*
|
* @param bs
|
* @return
|
*/
|
public static long BCD2Long_BE(byte[] bs){
|
long num = 0 ;
|
long multiple = 1 ;
|
for(int i = bs.length-1; i >= 0 ; i--){
|
num += (((bs[i] >> 4) * 10) + (bs[i] & 0xF)) * multiple ;
|
multiple = multiple * 100 ;
|
}
|
return num ;
|
}
|
|
/**
|
*
|
* @param bs
|
* @return
|
*/
|
public static String BCD2String_LE(byte[] bs) throws Exception{
|
StringBuilder sb = new StringBuilder();
|
for (int i = (bs.length - 1); i >= 0; i--) {
|
int value = (bs[i] + 256) % 256;
|
sb.append((char) (value / 16 + '0')).append((char) (value % 16 + '0'));
|
}
|
|
String result = sb.toString();
|
if (!result.matches("\\d*")) {
|
throw new Exception("解码BCD,但数据非BCD码!");
|
}
|
return result;
|
}
|
|
/**
|
*
|
* @param bs
|
* @return
|
*/
|
public static String BCD2String_BE(byte[] bs) throws Exception{
|
StringBuilder sb = new StringBuilder();
|
for (int i = 0; i < bs.length ; i++) {
|
int value = (bs[i] + 256) % 256;
|
sb.append((char) (value / 16 + '0')).append((char) (value % 16 + '0'));
|
value++;
|
}
|
String result = sb.toString();
|
if (!result.matches("\\d*")) {
|
throw new Exception("解码BCD,但数据(" + result + "非BCD码!");
|
}
|
return result;
|
}
|
|
public static void main(String[] args) throws Exception {
|
int num = 1234567;
|
byte[] bs = int2BCD_LE(num) ;
|
int num_ =BCD2Int_LE(bs) ;
|
System.out.println(num_);
|
bs = int2BCD_BE(num) ;
|
num_ = BCD2Int_BE(bs);
|
System.out.println(num_);
|
|
String str = "12345678901234567890" ;
|
bs = string2BCD_LE(str) ;
|
String str_ = BCD2String_LE(bs) ;
|
System.out.println(str_);
|
bs = string2BCD_BE(str) ;
|
str_ = BCD2String_BE(bs) ;
|
System.out.println(str_);
|
}
|
}
|