? ? ? ?BCD编码(Binary-Coded Decimal)是一种将十进制数字表示为二进制数的编码方式。在BCD编码中,每个十进制数字由四个二进制位表示。通常,一个字节(8位)可以编码两个十进制数字。
? ? ? ?在BCD编码中,每个十进制数字的范围是 0 到 9,分别用二进制的 0000 到 1001 表示。例如,十进制数 12 会以BCD编码为 0001 0010。
? ? 上位机开发过程需要下发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--;
}
}
}
(bcdBytes[i] & 0xF0) >> 4
?bcdBytes[i]
:这部分获取了数组 bcdBytes
中第 i
个字节的值。
& 0xF0
:这是一个按位与运算,使用十六进制值 0xF0
。在二进制中,0xF0
表示为 11110000
。这个操作的目的是屏蔽字节的低四位(即将低四位设为零),保留字节的高四位。
>> 4
:这是一个右移运算,向右移动 4 位。换句话说,它通过向右移动 4 位提取了前面操作得到的高四位。在BCD编码中,这通常代表了一个字节中的十位数字。
因此,(bcdBytes[i] & 0xF0) >> 4
用于从BCD数组 bcdBytes[i]
中提取高四位,通常用于BCD解码,因为高四位表示BCD编码字节中的十位数字。
?上位机接收到设备上传的数据还原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;
}
}
? ? ? ? BCD编码的优势是它直观地表示了十进制数字,例如在十六进制状态对应的就是十进制不需转换。相比于二进制编码,BCD编码更容易被人类理解和操作。但是它相对于二进制编码来说,使用的存储空间相对更多,因为每个十进制数字需要占用四位二进制位。BCD编码在以前的一些协议还有在采用,设计中更应该要考虑内存空间利用率,使用二进制表示十进制数字会更加节约内存空间。