主题:请教~~~~来人帮帮忙啊~
ugmjerry
[专家分:0] 发布于 2006-06-05 12:02:00
“从键盘输入两个十进制数,按照BCD原则相加,并显示结果。”
求原码~~~谢谢了~~~
回复列表 (共4个回复)
沙发
名无 [专家分:80] 发布于 2006-06-06 02:06:00
bcd 原则能具体说明一下,有何要求吗!
板凳
ugmjerry [专家分:0] 发布于 2006-06-06 08:41:00
BCD原则就是用BCD码。。。
BCD编码将一个字节的8个位拆分成高4位和低4位两个部分,也就是说一个字节能存储两个数字。所以BCD的编码过程就是将数字压缩的过程,将两个字节的数字压缩成一个字节。反之,解码就是把一个字节的数字拆分为两个数字单独存放(大部分的处理都是按字节处理的)。
示例:
编码过程,将数字69进行BCD编码(注:BCD编码低位在前,后面将不再注释)。
1. 将6,9分别转换成二进制表示:6(00000110)9(00001001),大家可以看到,最大的数字9也只要4个位,在传输过程中白白浪费了4个位;
2. 将69合并为一个字节,分别取6,9二进制编码的低4位,按照低位在前的原则,将9的低四位放前面6的低四位放后面得出新的字节二进制编码是10010110;
3. 完成编码过程,69的BCD编码结果为10010110。
解码过程:将69的BCD码10010110进行解码。
1. 将10010110的高4位与低4位拆分开,得到两个二进制数1001和0110;
2. 分别将1001和0110的前面补充4位0000得到两个8位的二进制数00001001,00000110;
3. 因为编码时低位在前,所以我们将两个二进制数编排顺序为00000110 000010001;
4. 将二进制数转换为十进制得出解码结果为69(正确解码)。
PB中如何对BCD码进行解码
大家知道在PB中有二进制类型的变量blob,但要无法按位操作,那么我们如何进行BCD编码的数字进行解码呢?
我想大家都会不约而同的想到ASCII码,没错,就是她。ASCII就是数字和字符在计算机中存储的的值,她在PB中给我们呈现的并不是01组成的二进制数而是十进制数值。
BCD解码需要将一个字节的高4位和低4位进行拆分,那么我们怎么来使用十进制的ASCII编码做到呢?
因为PB不提供位运算所以我们只能自己写函数来做些简单的处理了,那又如何处理呢?
方法一:我们写函数将十进制的ASCII(单字节)转化为二进制的字符串,当然,如此一来你还要写一个将二进制字符串转换为10进制数字的函数,有兴趣的朋友可以尝试一下。
方法二:在我上次写的内容中已经提到了,就是借助十六进制来完成转换。大家仔细研究不难发现十六进制表示等同于将一个字节的内容高4位和低4位分别转换为十进制,如果不信你可以自己验算一下。这样我们就只需要写一个转换函数了,将十进制数转换为十六进制字符串。转换后将十六串的两个字符位置对换(因为编码的时候低位在前),然后直接将这个串强制转换为数值型就得到了解码后的数值。(注:后面有一转换函数是网上一网友所写)
有了解码方法我们在读BCD码的地磅数据的时候就很容易处理了,因为我上次写过处理过程这里我只简单描述一下:
1. 用二进制类型blob将串口(现在有的用usb口)的数据读出来;
2. 将blob强制转换为string,这样就把二进制流按8位存储格式编码了,也就是说BCD码在这个string中,不过是压缩格式;
3. 将string的每个字节都分割开来,然后分别译为ASCII编码,PB中有函数ASC;
4. 根据具体设备出厂参数识别string中状态位,校验位,数字位等的位置;
5. 找到数字位进行BCD解码,方法如上;
如果你们没接触过这个 可以忽律这个原则 谢谢了~~
3 楼
qqssqs [专家分:320] 发布于 2006-06-06 09:51:00
看书!!!!!!!!
4 楼
名无 [专家分:80] 发布于 2006-06-06 13:35:00
你这里不是要求两个十进制相加,按bcd
那个是不是输入
11
11
输出
22
如果这样的话,也就是在程序内部处理时,按所谓bcd
在用户看来,跟普通的十进制相加没什么区别!是不是这样??
我来回复