442502587 发表于 2012-2-18 13:34:44

抛砖引玉:一个将4个字节的十六进制转为十进制的程序

在门禁行业经常要用到将十六进制卡号转为十进制的情况,当然对于比较小的数,直接除,取余就好了。但是对于这种超过10亿的数,我没有找到更好方法,为此,我上传自己写的程序,希望大家共同探讨

u32 Card_Num,tee;
u8 syy,qwbw,sww,qb,sg,i;

Card_Num=0XFFFFFFFF       

i=0;
        while(Card_Num>=1000000000)
        {
          Card_Num=Card_Num-1000000000;
                i++;
        }
        syy=i<<4;

    i=0;
        while(Card_Num>=100000000)
        {
          Card_Num=Card_Num-100000000;
                i++;
        }
        syy=syy+i;

    i=0;
        while(Card_Num>=10000000)
        {
          Card_Num=Card_Num-10000000;
                i++;
        }
        qwbw=i<<4;

    i=0;
        while(Card_Num>=1000000)
        {
          Card_Num=Card_Num-1000000;
                i++;
        }
        qwbw=qwbw+i;

        i=0;
        while(Card_Num>=100000)
        {
          Card_Num=Card_Num-100000;
                i++;
        }
        sww=i<<4;

        i=0;
        while(Card_Num>=10000)
        {
          Card_Num=Card_Num-10000;
                i++;
        }
        sww=sww+i;

        i=0;
        while(Card_Num>=1000)
        {
          Card_Num=Card_Num-1000;
                i++;
        }
        qb=i<<4;

        i=0;
        while(Card_Num>=100)
        {
          Card_Num=Card_Num-100;
                i++;
        }
        qb=qb+i;

        i=0;
        while(Card_Num>=10)
        {
          Card_Num=Card_Num-10;
                i++;
        }
        sg=i<<4;

        sg=sg+Card_Num;

wsm80828 发表于 2012-2-19 08:24:05

mark

mcu5i51 发表于 2012-2-19 09:09:41

很长。先写个两字节的BCD转换函数,之后把数值分解为4位的再调用两字节的就好了,可以弄个循环来执行;
两字节的也可以这样弄,相信多几次调用不会对时间影响太大

winterv 发表于 2012-2-19 10:21:25

syy=十亿/亿?
qwbw=千万/百万?
1 现有的代码可以再优化一下,将重复的部分写成内联函数。
2 Card_Num用取膜的方式直接获取它的数位,然后再移位转为syy的值,可以省去方法1的循环步骤,不知是否可行
页: [1]
查看完整版本: 抛砖引玉:一个将4个字节的十六进制转为十进制的程序