| New file | 
|  |  |  | 
|---|
|  |  |  | 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_); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|