转载请标注出处:(版权所有)

本文将从五点详细介绍bcd码和ascii 之间的关系,如下所示:

一、简介

二、用途

三、特点

四、代码原理

五、代码

1、ascii 转压缩bcd码   2、 压缩bcd 转ascii 码

六、总结语

正文

一、简介

(1) bcd 码(仅0-9)

bcd 二-十进制代码(Binary Coded Decimal):主要采用 4 位 表示一个十进制(通常一个字节只取低四位),常见的有8421码,如:0100 为4 范围为: 0-9 。 321则是:0011 0010 0001

(2) ascii 码

标准的ascii码值范围为 0-127 最高位为0,128-255为拓展的ascii码 例如由IBM自拓展的图形。

(3)压缩的bcd 码(包含 A-F)

由于bcd 码取低四个字节,导致高四个字节空闲没有,因此可以将十进制的两个字节压缩成1个字节 如 “32” 则为0x32

二、用途

(1)金额等仅数字的压缩

(2)表示发送内容的长度压缩

三、特点

1.有损压缩:  bcd 仅取后四个字节进行压缩,因此还原也仅低四位

2. 任意字符压缩: 本文代码是对任意字符进行压缩仅取后四位。(压缩bcd 仅用于0-9 A-F之间)

四、代码原理

0:0000    '0'  0011 0000   
1:0001    '1'  0011 0001      'A' 0100 0001'a' 0110 0001
2:0010    '2'  0011 0010      'B' 0100 0010'b' 0110 0010
3:0011 ~~~~              ‘C' 0100 0011'c' 0110 0011
4:0100 ~~~~ ~~~~ ~~~~
5:0101 ~~~~ ~~~~ ~~~~
6:0110 ~~~~ ~~~~ ~~~~
7:   0111 ~~~~ ~~~~ ~~~~
8:1000 ~~~~ ~~~~ ~~~~
9:   1001 ~~~~ ~~~~~~~~

其中 0-9 A-F a-f第四个字节是一样的。所以可以根据后四个字节进行压缩和还原

五、代码

1.ascii 转bcd 码

/*
nType  0 左靠右边补0  1 有靠左边补0
*/
int AscToBcd(const unsigned char *pszAscStr,int nLen, int nType, unsigned char *pszBcdStr)
{unsigned char *psTempbuf = (unsigned char *)pszAscStr;int nBcdCount = 0;int nIcount = 0;int nAsciiLen = 0;int nIsDouble = 0;//是否为双if(pszAscStr == NULL || pszBcdStr == NULL)return APP_FAIL;nAsciiLen =  strlen((char *)pszAscStr);if(nAsciiLen < nLen)nLen = nAsciiLen;elsenAsciiLen = nLen; //否则长度为原来的//判断单双  8421 所有除了第一位外所有相加都为偶数if(nLen&0x01 == 1){nIsDouble = 0;//奇数nAsciiLen = nLen -1;//判断靠的方向if(nType == 1) //向右边{nIcount = 1;nAsciiLen ++;//补齐回去}}else{nIsDouble = 1;}for (nBcdCount = nIcount; nIcount < nAsciiLen; nIcount ++,nBcdCount++){if ((psTempbuf[nIcount] >= 'A' &&    psTempbuf[nIcount] <= 'F' )||(psTempbuf[nIcount] >= 'a' &&  psTempbuf[nIcount] <= 'f' )){pszBcdStr[nBcdCount] = (int)(psTempbuf[nIcount++] & 0x0f) +9;}else{pszBcdStr[nBcdCount] = (int)(psTempbuf[nIcount++] & 0x0f);}if ((psTempbuf[nIcount] >= 'A' &&     psTempbuf[nIcount] <= 'F' )||(psTempbuf[nIcount] >= 'a' &&  psTempbuf[nIcount] <= 'f' )){pszBcdStr[nBcdCount] = (((int)pszBcdStr[nBcdCount]) << 4) | ((int)(psTempbuf[nIcount] & 0x0f) +9);}else{pszBcdStr[nBcdCount] = (((int)pszBcdStr[nBcdCount]) << 4) | ((int)(psTempbuf[nIcount] & 0x0f));}}if (nIsDouble == 0){if(nType == 1) //向右边{if ((pszAscStr[0] >= 'A' &&   pszAscStr[0] <= 'F' )||(pszAscStr[0] >= 'a' &&  pszAscStr[0] <= 'f' )){pszBcdStr[0] = (int)(psTempbuf[0] & 0x0f) +9;}else{pszBcdStr[0] = (int)(psTempbuf[0] & 0x0f) ;}}else //左靠{if ((pszAscStr[nIcount] >= 'A' &&   pszAscStr[nIcount] <= 'F' )||(pszAscStr[nIcount] >= 'a' &&  pszAscStr[nIcount] <= 'f' )){pszBcdStr[nBcdCount] = (int)(psTempbuf[nIcount] & 0x0f) +9;}else{pszBcdStr[nBcdCount] = (int)(psTempbuf[nIcount] & 0x0f) ;}pszBcdStr[nBcdCount] =    pszBcdStr[nBcdCount] << 4;//左移动}}return APP_SUCCESS;
}

2.bcd 转ascii

int BcdToAsc(const unsigned char *pszBcdStr,int nLen, int nType, unsigned char *pszAscStr)
{unsigned char *psTempbuf = (unsigned char *)pszBcdStr;int nHight = 0;//高四位int nLow = 0;//第四位int nIcount = 0;int nAsciiLen = 0;int nIsDouble = 0;//是否为双if(pszAscStr == NULL || pszBcdStr == NULL)return APP_FAIL;//判断单双  8421 所有除了第一位外所有相加都为偶数if(nLen&0x01 == 1) //3{nIsDouble = 0;//奇数//判断靠的方向if(nType == 1) //向右边{nIcount = 1;}else{nLen --;//左边对齐}}else{nIsDouble = 1;}for (nAsciiLen = nIcount; nAsciiLen < nLen; nIcount ++){nHight = (int)(pszBcdStr[nIcount])>>4;nLow = (int)(pszBcdStr[nIcount])&0x0f;if ( nHight > 9 && nHight < 16 ){pszAscStr[nAsciiLen ++] = nHight + 'A' -10; }else{pszAscStr[nAsciiLen ++] = nHight + '0' -0; }if ( nLow > 9 && nLow < 16 ){pszAscStr[nAsciiLen ++] = nLow + 'A' -10; }else{pszAscStr[nAsciiLen ++] = nLow + '0' -0; }}if (nIsDouble == 0){if(nType == 1) //向右边{nLow = (int)(pszBcdStr[0])&0x0f;if ( nLow > 9 && nLow < 16 ){pszAscStr[0 ] = nLow + 'A' -10; }else{pszAscStr[0] = nLow + '0' -0; }}else //左靠{nHight = (int)(pszBcdStr[nIcount])>>4;if ( nHight > 9 && nHight < 16 ){pszAscStr[nAsciiLen ] = nHight + 'A' -10; }else{pszAscStr[nAsciiLen ] = nHight + '0' -0; }}}return APP_SUCCESS;
}

c语言 ascii 和 压缩bcd 码之间的相互转换相关推荐

  1. C语言实现ASCII字符、压缩BCD码值与BIN码(16进制)互转 - (已编译,亲试可用)

    目录 1.将压缩BCD码转为BIN码 2.将压缩BCD码数组转为BIN码数组 3.将BIN码转为压缩BCD码 4.将BIN码数组转为压缩BCD码数组 5.将ASCII码转为BIN码 6.将ASCII码 ...

  2. 【51单片机汇编】将30H-34H单元中的压缩BCD码转化为ASCII码,并存入60H-69H

    BCD转ASCII,如BCD码24H,转成ASCII应为34H和32H,即,将BCD的低高位分别提取出来加上30H就能转换为ASCII ;BCD转ASCIIORG 0000HMOV 30H, #25H ...

  3. x86汇编_ASCII和非压缩BCD码运算_AAA / AAS_笔记56

    虽然 CPU 用二进制运算,但是也可以执行 ASCII 十进制串的运算.使用后者进行运算,对用户而言既便于输入也便于在控制台窗口显示,因为不用进行二进制转换.尽管 ASCII 运算执行速度比二进制运算 ...

  4. 汇编--子程序设计(1)--非压缩bcd码和十进制的转换

    输入四位十六进制数,显示对应的十进制数(还有位对应的值,以T作为结束符). ;PROGRAM GOES HERE;13:34 2023/4/15-------17:38 2023/4/16----17 ...

  5. 汇编语言实现非压缩BCD码整数除法

    汇编语言实验 非压缩BCD码整数除法 1. 流程图 Created with Raphaël 2.2.0Begin设置除数.被除数的地址指针:字节除法的次数十进制调整字节除法.存商被除数各位已除完?调 ...

  6. 压缩BCD码拆成两个ACSII码存入指定单元【汇编语言】

    将片内RAM的20H单元中的压缩BCD码拆成两个ACSII码存入21H.22H单元.低4位存在21H单元,高4位存在22H单元. 思路: 压缩BCD码和非压缩BCD码的区别 一个BCD码占4位,而一个 ...

  7. [计组]压缩BCD码指二进制编码的十进制

    压缩BCD码指二进制编码的十进制 压缩BCD码指一个字节8位存储2位BCD码.比如32用8421BCD码表示如下:非压缩BCD码表示:00000011 00000010:压缩BCD码表示:0011 0 ...

  8. 字符串转成压缩bcd码

    /* * 字符串转成压缩bcd码 */ /**************************************************************/ /*如果要对字符串转换为左靠齐 ...

  9. C51单片机的压缩BCD码相加程序

    设被加数 NA 及加数 NB 均为三字节压缩BCD码,分别存放于内部 RAM 的 20H~22H 及 30H~32H 单元中,低位在前,高位在后. 要求计算两数之和,并将和存放到内部 RAM 中 3F ...

最新文章

  1. java servlet 路径_JavaServlet 路径书写总结
  2. 【青少年编程(第29周)】8月份的青少年编程组队学习结营了!
  3. pycharm 远程调试图文_Pycharm配置远程调试的图文步骤
  4. Windows批处理中的等待技巧
  5. 面试必备:ArrayList源码解析(JDK8)
  6. Python_list部分功能介绍
  7. linux 下测速时间分析
  8. mybatis-plus忽略映射字段
  9. 甘肃省智慧教育云平台实名认证_“好分数”甘肃行,人工智能助力教育均衡
  10. Sublime Text 如何连接 FTP/SFTP ——图文详细教程
  11. DC888 : worklist slovers
  12. HTML如何实现简单登录页面
  13. MSM8960 // F200 引导装载程序 (Bootloader) 之研读
  14. 工业物联网快速解决方案
  15. 产品生产的各个阶段:DV,EV,PV ········是什么意思
  16. PyCenterNetDetector is not in the models registry
  17. Zabbix-Sender 增加自定义监控项-- Ping 到目的地链路监控--bat脚本循环运行
  18. 腾讯视频2019面试题目分享
  19. python PEP8问题及解决
  20. 深度学习1(hinton)

热门文章

  1. 计算机网络实验——交换机的Telnet远程登陆配置
  2. pycharm出现This licensehas been suspended的解决办法
  3. 专科段《基础会计学》课程复习资料(4)——简答题及名词解释
  4. 转战前端 jQuery
  5. 洲际旗下宾客忠诚奖励计划IHG优悦会宣布全新会籍政策;万旅享家与FLYERT飞客宣布建立积分兑换合作伙伴关系 | 全球旅报...
  6. 运放之求解输出失调电压
  7. Android入门第35天-Android里的SubMenu
  8. Vagrant 部署环境
  9. 机器学习算法工程师面试总结
  10. Linux服务器部署mono+jexus发布asp.net网站