一文深入了解BCD码

什么是BCD码?

BCD码(Binary-Coded Decimal‎),用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数字编码形式,用二进制编码的十进制代码。
BCD码也称二进码十进数,BCD码可分为有权码和无权码两类。其中,常见的有权BCD码有8421码、2421码、5421码,无权BCD码有余3码、余3循环码、格雷码,其中最常使用的为8421码,下面所述的都是基于8421码。

BCD码的优点

相对浮点数,采样BCD码可保持数据精度,又可以免去CPU计算浮点所消耗的时间。
相对浮点数,BCD码使用二进制编码表示十进制编码,使得数字可读性更好。如数字1234.56,使用BCD码表示为0x123456。
相对字符串,BCD编码效率更高,如数字1234.56,使用字符串需7个字节,采用BCD只需3字节。

BCD码应用

数据传输编码。
仪器设备显示。

常用BCD数据格式转换

  • BCD码转字符串
uint8_t bcd_to_integer_string(char* pDes, uint8_t* bcd_buf, uint8_t bcd_size)
{
  uint8_t cnt = 0;
  
  
  for (cnt = 0; cnt < bcd_size; cnt++)
  {
    pDes[cnt * 2 + 1]  = NUM_TO_CHAR(bcd_buf[bcd_size - 1 - cnt] & 0x0f);
    pDes[cnt * 2]    = NUM_TO_CHAR((bcd_buf[bcd_size - 1 - cnt] >> 4) & 0x0f);
  }
  pDes[cnt * 2] = '\0';
  return cnt * 2;
}

单元测试
static BOOL bcd_to_string_test1(void )
{
uint8_t bcd_buf[5] = { 0x90,0x78,0x56,0x34,0x12 }; //BCD 0X1234567890
char ch[20] = “”;

bcd_to_integer_string(ch, bcd_buf, sizeof(bcd_buf));

assert(strcmp(ch, “1234567890”) == 0);
return TRUE;
}

  • BCD转32位整数
uint32_t bcd_to_u32(const uint8_t* bcd_buf,uint8_t bcd_size)
{
  uint8_t* data = (uint8_t*)bcd_buf;
  uint32_t multipy = 1;
  uint32_t sum = 0;
  uint8_t temp = 0;
  int i = bcd_size;

  while (i-- > 0)
  {
    sum *= 100ul;
    temp = (data[i] & 0xf);
    temp += ((data[i] >> 4) & 0xf) * 10u;
    sum += temp;
  }
  return sum;
}

单元测试

static void bcd_to_u32_test1(void)
{
  uint8_t bcd_buf[5] = { 0x90,0x78,0x56,0x34,0x12 }; //BCD 0X1234567890
  uint32_t temp = 0;

  temp = bcd_to_u32(bcd_buf, sizeof(bcd_buf));
  assert(temp == 1234567890);
  return;
}

static void bcd_to_u32_test2(void)
{
  uint8_t bcd_buf[4] = { 0x44,0x66,0x33,0x55 }; //BCD 0X1234567890
  uint32_t temp = 0;

  temp = bcd_to_u32(bcd_buf, sizeof(bcd_buf));
  assert(temp == 55336644);
  return;
}

static void bcd_to_u32_test3(void)
{
  uint8_t bcd_buf[2] = { 0x44,0x66}; //BCD 0X1234567890
  uint32_t temp = 0;

  temp = bcd_to_u32(bcd_buf, sizeof(bcd_buf));
  assert(temp == 6644);
  return;
}

static void bcd_to_u32_test4(void)
{
  uint8_t bcd_buf[1] = { 0x55}; //BCD 0X1234567890
  uint32_t temp = 0;

  temp = bcd_to_u32(bcd_buf, sizeof(bcd_buf));
  assert(temp == 55);
  return;
}

void bcd_to_u32_unit_test(void)
{
  bcd_to_u32_test1();
  bcd_to_u32_test2();
  bcd_to_u32_test3();
  bcd_to_u32_test4();
}

关注我

关注我,分析各种嵌入式的原创文章

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值