读书人

苦思不得其果!求高手速速来救!十进制

发布时间: 2012-05-27 05:42:30 作者: rapoo

苦思不得其果!求高手速速来救!十进制转BCD!
我打算做一个十六进制到BCD码的转换,
一个字节的转换倒是没问题,
可是问题是,这个BCD码分为了3个字节!

比如说我保存了778899这个数字,用3个字节的BCD码保存也就是0x77,0x88,0x99,

问题来了,把这3字节的BCD码转换为了十进制的方法倒是简单,我把这3字节保存在数组里,然后用下面这个函数:
大概可以这么写

C/C++ code
unsigned long BcdtoHex(UCHAR *bcd){unsigned long BcdtoHex(UCHAR *bcd){    unsigned long hex=0,temp;    temp=(*bcd)/16;    hex+=(temp*100000+(*bcd)%16*10000);    printf("%ld\n",hex);    temp=(bcd[1])/16;    hex+=(temp*1000+(bcd[1])%16*100);    printf("%ld\n",hex);    temp=(bcd[2])/16;    hex+=(temp*10+(bcd[2])%16);    printf("%ld\n",hex);    return(hex);}



而十进制转成BCD码的函数该怎么写?我用上面这个函数转换得到的十进制数后,做完数值处理,再转换成3个字节的BCD码,
比如得到十进制778899,转换成BCD码0x77,0x88,0x99?????

想一上午了不知道怎么搞!小弟新手,望各位大侠帮帮忙!实在是想不出啥办法来了!

[解决办法]
BCD码不是 4位还是一个字节表示一个十进制的吗??
[解决办法]
4位表示一个十进制数的
十进制转bcd.

unsigned int n=45678;
unsigned char buf[16];
sprintf(buf,"%u",n);
int len=strlen(buf);
unsigned char bcd[16]={0};
for(int i=len-1;i!=0;--i)
{
bcd[i/2]|=(buf[i]-'0')<<(!(i&1)*4);
}
bcd[(len-1)/2+1]='\0';
...
好乱
[解决办法]
压缩BCD码与非压缩BCD码的区别—— 压缩BCD码的每一位用4位二进制表示,一个字节表示两位十进制数。例如10010110B表示十进制数96D;非压缩BCD码用1个字节表示一位十进制数,高四位总是0000,低4位的0000~1001表示0~9.例如00001000B表示十进制数8.
[解决办法]
不过看你1L的意思,大概最多 8位数,4个字节够了?
如果是固定的,那么就好做多了.
否则,还是很烦人的.

[解决办法]
十进制778899,先转换成77;88;99三个数
然后
a=7+7*16
b=8+8*16
c=9+9*16

[解决办法]
如果可以用库函数的话,可以用下面的方法:
#include <stdlib.h>

unsigned int dec_to_bcd(unsigned int dec_val)
{
char buf[16] = {0};

_itoa(dec_val, buf, 10);
return strtol(buf, 0, 16);

}//end of dec_to_bcd()
[解决办法]
void itob(int nu)
{
while(nu)
{
printf("%c",'0'+nu&(1UL<<31); //32位机
nu=nu<<1;
}
putchar('\n');
}
以上为用以为做
[解决办法]
移 位

读书人网 >C语言

热点推荐