• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

如何用代码实现将十六进制数0x20转换成十进制数20?

SingleYork 2018-03-27 浏览量:4759

在用单片机与别的外设做串口通信传递数据的时候,经常会遇到各种数据类型的转换,比如,设备端发送出来的当前日期信息本来对应的十进制应该是:18-3-27 9:00:00,但是实际传递过来的数据却都是十六进制,并且也正好是:0x18 0x03 0x27 0x09 0x00 0x00,如果直接将这数据转发的话,就变成了十进制:24 03 39 09 00 00,所以需要转换一下,即:将十六进制数0x18转换成十进制18、十六进制数0x03转换成十进制3……运行环境为keil 4/keil 5。


一个典型应用,比如迪文的DGUS屏,串口读取RCT命令为(十六进制):5A A5 03 81 20 07​,触摸屏返回(十六进制):5A A5 0A 81 20 07 18(年) 03(月)26(日) 01(星期) 17(时) 33(分) 13(秒),如果单纯的处理收到的数据对应的十进制日期变成了:24年3月38日 23点51分13秒,而 实际上我们程序中要处理的是对应的十进制日期:18年3月26日 17点33分13秒。


那么问题来了,如何能实现快速转换等到想要的十进制数?

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 如果是你说的这个样子的话,写一个Hex2Dec函数吧

    比如

    int Hex2Dec(int Hex)
    {
        int dec=0,temp=0;
        temp= Hex & 0x0f;  //低四位
        dec = (Hex >> 4) *10 + temp;//高四位乘10加低四位
        return dec;
    }

    • 发布于 2018-03-27
    • 举报
    • 评论 5
    • 1
    • 0
SingleYork 回复了 fighter-12315:这确实是一个不错的方法,不知道有没有自带的函数可以直接调用的…… 回复
fighter-12315 回复了 fighter-12315:这种没有吧,自己写也耗不了多少时间哈哈哈,很多进制转换都得自己写的,什么BCD2Hex啊的。对了,如果是双方通信的话你在写一个Dec2Hex就行了 回复
7943603 回复了 fighter-12315:还可以 回复
SingleYork 回复了 fighter-12315:嗯,确实不错,哈哈 回复
电子老工程师 回复了 :963716-1Y已经停产 5-963716-1 是原厂推荐替代型号。 回复

其他答案 数量:8
  • 十六进制和ASC码之间的转换代码如下,可以参考。

    //将一个十六进制数转换成两个ASCII码
    word Hex2Word(byte data)
    {
    	byte btmp;  //定义一个byte临时变量
    	word wtmp;  //定义一个word临时变量
    	btmp=data&0xF0;   //先取data的高四位
    	btmp=btmp>>4;  //把高四位移动到低四位
    	if(btmp<=9){//如果是0~9
    		btmp+=0x30;
    	}else  //如果是a~f
    	{
    		btmp+=0x37;
    	}
    	wtmp=btmp;
    	wtmp=wtmp<<8;
    
    	btmp=data&0x0F;
    	if(btmp<=9){//如果是0~9
    			btmp+=0x30;
    	}else  //如果是a~f
    	{
    			btmp+=0x37;
    	}
    	wtmp+=btmp;
    	return wtmp;
    }
    byte Word2Hex(word data)
    {
    	byte btmp,ret;
    	btmp=data>>8;
    	if((btmp>=0x30)&&(btmp<=0x39))
    	{
    		ret=btmp-0x30;
    	}else if((btmp>=0x41)&&(btmp<=0x46))
    	{
    		ret=btmp-0x37;
    	}else if((btmp>=0x61)&&(btmp<=0x66))
    	{
    		ret=btmp-0x57;
    	}
    	ret=ret<<4;
    	btmp=data&0x00FF;
    	if((btmp>=0x30)&&(btmp<=0x39))
    	{
    		btmp=btmp-0x30;
    	}else if((btmp>=0x41)&&(btmp<=0x46))
    	{
    		btmp=btmp-0x37;
    	}else if((btmp>=0x61)&&(btmp<=0x66))
    	{
    		btmp=btmp-0x57;
    	}
    	ret+=btmp;
    	return ret;
    }

    • 发布于2018-03-27
    • 举报
    • 评论 1
    • 1
    • 0
电子老工程师 回复了  :型号错误,请确认。 或者提供参数选型。 回复

  • 比如 你的数字是0x18,你   a=0x18;

                                         b=a>>4;

                                         b*=6;

                                         结果=a-b;

    • 发布于2018-03-27
    • 举报
    • 评论 1
    • 1
    • 0
电子老工程师 回复了  :RNF-100-1/4-0-SP-KF 非原厂型号,前台型号数据错误。 回复

SingleYork 回复了 apleilx :你这一句跟写一个函数没啥区别…… 回复
电子老工程师 回复了  :尾缀部分是包装代码,#30的具体包装资料没有说明 回复

  • 不讲代码,直接讲思路吧。
    因为是十六进制嘛,直接拿数据除以 16 取整得到高位数,

    如果0xXXX三位数字,取最高位,就除以 (16*16)

    除以16取余数做最低位
    例子:0x20/16 = 2, 将2存在变量a;

    0x20%16 = 0,将0存在变量b;

    然后转换一下a 和 b的ASSC码,或者 直接 a*10 + b 当十进制用,就是你的事了

    • 发布于2018-03-27
    • 举报
    • 评论 1
    • 1
    • 0
电子老工程师 回复了  :包装区别,R:卷装,没R:管装 回复

  • 查0x,把0x删了就是了。一般都是会给ASCII格式的,没遇到你说的这种情况

    • 发布于2018-03-27
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :https://assets.nexperia.com/documents/data-sheet/PSMP033-60YE.pdf 回复

  • while(num>0) 
    { 
    yushu=num%16; 
    a[i]=yushu; 
    num=num/16; 
    i++;
    } 
    
    • 发布于2018-03-27
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :见衔接,请根据参数,封装选择正确的型号https://www.ti.com.cn/product/cn/LM2596?keyMatch=LM2596&tisearch=search-everything&usecase=GPN 回复

  • 下面的代码仅仅对16bit数据有效,超过的无效。
    in=0x18; out= (in>>4)*10+(in&0x0f);

    • 发布于2018-03-27
    • 举报
    • 评论 2
    • 0
    • 0
xdsnet 回复了 xdsnet :它等效于 out=(in/16)*10+in%16 回复
电子老工程师 回复了  :可以替代,参数和封装完全一样 回复

  • 这个好办,把十六进制数的高低四位拆开两个部分就可以了,因为待处理的数据只有0-9没有A-F,因此不需要做任何转换。

    • 发布于2018-03-27
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :74LVC1G02GW,125是原厂标准型号 回复

相关问题

问题达人换一批

如何用代码实现将十六进制数0x20转换成十进制数20?