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--;
}
}
}
实现思路说明:
- 将整数拆分为个位和十位。
- 将拆分得到的个位和十位转换为BCD编码。
关键转换BCD代码解析:(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编码字节中的十位数字。
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编码在以前的一些协议还有在采用,设计中更应该要考虑内存空间利用率,使用二进制表示十进制数字会更加节约内存空间。
原文地址:https://blog.csdn.net/qyhua/article/details/135619663
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!