c语言 ascii 和 压缩bcd 码之间的相互转换
转载请标注出处:(版权所有)
本文将从五点详细介绍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 码之间的相互转换相关推荐
- C语言实现ASCII字符、压缩BCD码值与BIN码(16进制)互转 - (已编译,亲试可用)
目录 1.将压缩BCD码转为BIN码 2.将压缩BCD码数组转为BIN码数组 3.将BIN码转为压缩BCD码 4.将BIN码数组转为压缩BCD码数组 5.将ASCII码转为BIN码 6.将ASCII码 ...
- 【51单片机汇编】将30H-34H单元中的压缩BCD码转化为ASCII码,并存入60H-69H
BCD转ASCII,如BCD码24H,转成ASCII应为34H和32H,即,将BCD的低高位分别提取出来加上30H就能转换为ASCII ;BCD转ASCIIORG 0000HMOV 30H, #25H ...
- x86汇编_ASCII和非压缩BCD码运算_AAA / AAS_笔记56
虽然 CPU 用二进制运算,但是也可以执行 ASCII 十进制串的运算.使用后者进行运算,对用户而言既便于输入也便于在控制台窗口显示,因为不用进行二进制转换.尽管 ASCII 运算执行速度比二进制运算 ...
- 汇编--子程序设计(1)--非压缩bcd码和十进制的转换
输入四位十六进制数,显示对应的十进制数(还有位对应的值,以T作为结束符). ;PROGRAM GOES HERE;13:34 2023/4/15-------17:38 2023/4/16----17 ...
- 汇编语言实现非压缩BCD码整数除法
汇编语言实验 非压缩BCD码整数除法 1. 流程图 Created with Raphaël 2.2.0Begin设置除数.被除数的地址指针:字节除法的次数十进制调整字节除法.存商被除数各位已除完?调 ...
- 压缩BCD码拆成两个ACSII码存入指定单元【汇编语言】
将片内RAM的20H单元中的压缩BCD码拆成两个ACSII码存入21H.22H单元.低4位存在21H单元,高4位存在22H单元. 思路: 压缩BCD码和非压缩BCD码的区别 一个BCD码占4位,而一个 ...
- [计组]压缩BCD码指二进制编码的十进制
压缩BCD码指二进制编码的十进制 压缩BCD码指一个字节8位存储2位BCD码.比如32用8421BCD码表示如下:非压缩BCD码表示:00000011 00000010:压缩BCD码表示:0011 0 ...
- 字符串转成压缩bcd码
/* * 字符串转成压缩bcd码 */ /**************************************************************/ /*如果要对字符串转换为左靠齐 ...
- C51单片机的压缩BCD码相加程序
设被加数 NA 及加数 NB 均为三字节压缩BCD码,分别存放于内部 RAM 的 20H~22H 及 30H~32H 单元中,低位在前,高位在后. 要求计算两数之和,并将和存放到内部 RAM 中 3F ...
最新文章
- java servlet 路径_JavaServlet 路径书写总结
- 【青少年编程(第29周)】8月份的青少年编程组队学习结营了!
- pycharm 远程调试图文_Pycharm配置远程调试的图文步骤
- Windows批处理中的等待技巧
- 面试必备:ArrayList源码解析(JDK8)
- Python_list部分功能介绍
- linux 下测速时间分析
- mybatis-plus忽略映射字段
- 甘肃省智慧教育云平台实名认证_“好分数”甘肃行,人工智能助力教育均衡
- Sublime Text 如何连接 FTP/SFTP ——图文详细教程
- DC888 : worklist slovers
- HTML如何实现简单登录页面
- MSM8960 // F200 引导装载程序 (Bootloader) 之研读
- 工业物联网快速解决方案
- 产品生产的各个阶段:DV,EV,PV ········是什么意思
- PyCenterNetDetector is not in the models registry
- Zabbix-Sender 增加自定义监控项-- Ping 到目的地链路监控--bat脚本循环运行
- 腾讯视频2019面试题目分享
- python PEP8问题及解决
- 深度学习1(hinton)
热门文章
- 计算机网络实验——交换机的Telnet远程登陆配置
- pycharm出现This licensehas been suspended的解决办法
- 专科段《基础会计学》课程复习资料(4)——简答题及名词解释
- 转战前端 jQuery
- 洲际旗下宾客忠诚奖励计划IHG优悦会宣布全新会籍政策;万旅享家与FLYERT飞客宣布建立积分兑换合作伙伴关系 | 全球旅报...
- 运放之求解输出失调电压
- Android入门第35天-Android里的SubMenu
- Vagrant 部署环境
- 机器学习算法工程师面试总结
- Linux服务器部署mono+jexus发布asp.net网站