上位机编程:bcd编码精讲

一 BCD编码介绍

       BCD编码(Binary-Coded Decimal)是一种将十进制数字表示为二进制数的编码方式。在BCD编码中,每个十进制数字由四个二进制位表示。通常,一个字节(8位)可以编码两个十进制数字。

       在BCD编码中,每个十进制数字的范围是 0 到 9,分别用二进制的 0000 到 1001 表示。例如,十进制数 12 会以BCD编码为 0001 0010。

二 BCD编码转换

  int 转 byte[] 的bcd格式:

    上位机开发过程需要下发bcd格式的数据到设备用java代码实现:

/**
 * 下发bcd数据到设备
 * @author hua
 * @date 2024-01-16 11:15
 */
public class TestBcd {
  

        public static void main(String[] args) {
            int decimalValue = 12345678;
            
            byte[] bcdBytes = intToBcd(decimalValue,4);
            for (byte b : bcdBytes) {
                System.out.printf("%02X ", b);
            }
        }

    /**
     * 将int转换成bcd
     * @param value 数值
     * @param len 下发要求bcd长度
     * @return
     */
        public static byte[] intToBcd(int value,int len) {
            int temp = value;
            int digit;
            int index = 0;
            byte[] bcdBytes = new byte[len]; 

            // 转换每1位数字成bcd
            while (temp != 0) {
                digit = temp % 10;
                temp /= 10;

                //转换后保存在数组
                bcdBytes[index] = (byte) ((temp % 10 << 4) | digit);
                index++;
            }

            // 反转byte数组排序 
            reverseArray(bcdBytes);

            return bcdBytes;
        }

        private static void reverseArray(byte[] array) {
            int left = 0;
            int right = array.length - 1;

            while (left < right) {
                byte temp = array[left];
                array[left] = array[right];
                array[right] = temp;
                left++;
                right--;
            }
        }
    
}

 实现思路说明: 

  1. 将整数拆分为个位和十位。
  2. 将拆分得到的个位和十位转换为BCD编码。

 关键转换BCD代码解析:(bcdBytes[i] & 0xF0) >> 4 

  1. bcdBytes[i]:这部分获取了数组 bcdBytes 中第 i 个字节的值。

  2. & 0xF0:这是一个按位与运算,使用十六进制值 0xF0。在二进制中,0xF0 表示为 11110000。这个操作的目的是屏蔽字节的低四位(即将低四位设为零),保留字节的高四位。

  3. >> 4:这是一个右移运算,向右移动 4 位。换句话说,它通过向右移动 4 位提取了前面操作得到的高四位。在BCD编码中,这通常代表了一个字节中的十位数字。

因此,(bcdBytes[i] & 0xF0) >> 4 用于从BCD数组 bcdBytes[i] 中提取高四位,通常用于BCD解码,因为高四位表示BCD编码字节中的十位数字。

   bcd格式 的byte[] 转 int:

 上位机接收到设备上传的数据还原int值用java代码实现:

/**
 * 下发bcd数据到设备
 * @author hua
 * @date 2024-01-16 11:26
 */
public class TestBcd {


    public static void main(String[] args) {
        byte[] bcdBytes = {0x12, 0x34, 0x56, 0x78}; // 12345678 in BCD

        int decimalValue = bcdToDecimal(bcdBytes);
        System.out.println("value: " + decimalValue);
    }

    public static int bcdToDecimal(byte[] bcdBytes) {
        int result = 0;

        for (int i = 0; i < bcdBytes.length; i++) {
            int highNibble = (bcdBytes[i] & 0xF0) >> 4;
            int lowNibble = bcdBytes[i] & 0x0F;

            result = result * 100 + highNibble * 10 + lowNibble;
        }

        return result;
    }

}

三 BDC编码总结

        BCD编码的优势是它直观地表示了十进制数字,例如在十六进制状态对应的就是十进制不需转换。相比于二进制编码,BCD编码更容易被人类理解和操作。但是它相对于二进制编码来说,使用的存储空间相对更多,因为每个十进制数字需要占用四位二进制位。BCD编码在以前的一些协议还有在采用,设计中更应该要考虑内存空间利用率,使用二进制表示十进制数字会更加节约内存空间。

你可能感兴趣的:(java,算法,数据结构)