OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12570|回复: 14

请教大神们,如何用C语言将十六位十六进制的数转化成十进制数?

[复制链接]

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
发表于 2015-11-12 13:25:23 | 显示全部楼层 |阅读模式
5金钱
例如,我要将0x1234转换成十进制的数,C语言要怎样实现呢?我试过很愚蠢的方法,把0x1234分4次分别与上0x1000,0x0100,0x0010,0x0001,然后分别除以16^3,16^2,16^1,1,出来结果是错误的...

最佳答案

查看完整内容[请看2#楼]

回复【13楼】ljjdglg520: --------------------------------- 直接使用printf当然不可以啊,因为它默认的输出设备是控制台,你想要将字符串输出到usart,那要先重定向putchar()函数 11楼给出的方法是先用vsprintf将数据格式化输出到字符串,然后在用串口输出函数将这个字符串输出 va_list, va_start, va_end 是stdarg提供的变长参数的提取方案,你包含了#include <stdarg.h>,就能使用这个功能了 你自己上网搜 ...
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2015-9-25
在线时间
4 小时
发表于 2015-11-12 13:25:24 | 显示全部楼层
回复【13楼】ljjdglg520:
---------------------------------
直接使用printf当然不可以啊,因为它默认的输出设备是控制台,你想要将字符串输出到usart,那要先重定向putchar()函数

11楼给出的方法是先用vsprintf将数据格式化输出到字符串,然后在用串口输出函数将这个字符串输出
va_list, va_start, va_end 是stdarg提供的变长参数的提取方案,你包含了#include <stdarg.h>,就能使用这个功能了

你自己上网搜搜:printf重定向,stdarg,变长参数.  就都明白了.  不要寻求现成的东西,那样没啥进步. 世界是公平的,越难的事,做成了收获就越多
供大家参考,希望和同行交流经验
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-11-12 13:29:04 | 显示全部楼层
应该分别乘16的n次方

for循环+右移指令

笨点的就自己找几个数按照自己的算法测试看能不能出正确结果
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2015-11-12 13:30:49 | 显示全部楼层
回复【2楼】龙之谷:
---------------------------------
昨晚试了一个晚上,就是拿了最简单的8位0x12来试,移位,乘,除,与,都用过了,就是出不来结果- -
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2015-11-12 13:32:56 | 显示全部楼层
回复【2楼】龙之谷:
---------------------------------
光棍节还在敲代码,注定孤独一生啊我
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-11-12 13:47:25 | 显示全部楼层
是需要用十进制来显示吗?在内存中十六进制和十进制的数据是没有区别的,所以只是在相同的数据展示给人看的时候需要处理,要不参考下printf的实现,%d就是以十进制来显示,%x就是以十六进制显示。

P.S:我光棍节也在敲代码啊,已经有女儿了,敲码和光棍和孤独没关系,呵呵。
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2015-11-12 13:56:59 | 显示全部楼层
回复【5楼】ianhom:
---------------------------------
捏个,我现在在开发zigbee方面的,没有printf那些用。。有的话就很容易了,我目前只会输出字符,所以要把数据分离开来
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-11-12 14:09:51 | 显示全部楼层
回复【6楼】ljjdglg520:
---------------------------------
用的是ti的2530开发的吗,我记得z-stack提供了类似printf的函数可以输出十进制,你找找看
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2015-11-12 14:17:13 | 显示全部楼层
回复【7楼】ianhom:
---------------------------------
酱紫,我现在只会HalUARTWrite这个函数打印字符串,我好好找找看,3Q
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

6

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2015-9-25
在线时间
4 小时
发表于 2015-11-12 14:34:35 | 显示全部楼层
回复【6楼】ljjdglg520:
---------------------------------
#define HEX = 0x12345678;
char dec[20];
char *p_dec = &dec[20];
char *p_dec2 = &dec[0];
usigned long tmp;
for(tmp=HEX; tmp>0; tmp /= 10)   //将HEX变成十进制的字符串(不含'\0'),存入到dec[]中,但是是右对齐
    {
    *p_dec = tmp % 10 + '0';     //每次都对HEX做:取个位数,然后将HEX整除10,取到的数存入到dec[]中
    p_dec--;
    }
p_dec++;        //对字符串添加'\0'
for(*p_dec2=&dec[0];p_dec !=&dec[21];)   //将字符串右对齐变成左对齐
    {
    *p_dec2 = *p_dec;
    p_dec2++;
    p_dec++;
    }
*p_dec2 = '\0';

//此时十进制字符串就在dec[]数组中了
供大家参考,希望和同行交流经验
回复

使用道具 举报

6

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2015-9-25
在线时间
4 小时
发表于 2015-11-12 14:45:44 | 显示全部楼层
//使用vsprintf()函数将数据格式化输出到数组中,是一劳永逸的方式
//<stdio.h>属于C标准库,只要是能够使用C语言的集成开发环境中,都必须包含C标准库,这是ANSI规定的
//所以只要你使用C,你就放心使用vsprintf()吧,保证绝对支持

#include <stdio.h>

#define HEX = 0x12345678;

uint8_t tstr[100];

vsprintf(&tstr[0],"This is the decimalism converted from Hex: %d",HEX);

//现在tstr[]中存入的数据是:"This is the decimalism converted from Hex: 305419896"

//希望我的回复你还满意

供大家参考,希望和同行交流经验
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2015-11-12 15:25:32 | 显示全部楼层
回复【10楼】kinkun:
---------------------------------
首先谢谢你的解答,我现在有个问题就是,在IAR的环境下加入了stdio.h这个头文件,但是用printf打印不了东西,但是编译不出错。。。
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2015-11-12 20:33:36 | 显示全部楼层
回复【11楼】ljjdglg520:
---------------------------------
[mw_shl_code=c,true]/********************************************************************* * @fn SerialPrintf * * @brief 实现标准C中printf函数 * * @return 打印的字符数 */ static uint32 SerialPrintf(const char *fmt, ...) { uint32 ulLen = 0; va_list ap; char *pBuf = (char *) osal_mem_alloc(128); // 开辟缓冲区 va_start(ap, fmt); ulLen = vsprintf(pBuf, fmt, ap); // 用虚拟打印函数实现 va_end(ap); HalUARTWrite(HAL_UART_PORT_0, (uint8 *) pBuf, ulLen); // 从串口0输出 osal_mem_free(pBuf); // 释放内存空间 pBuf = NULL; return ulLen; // 返回打印的字符数 }[/mw_shl_code]


你把这个移植过去,就可以实现printf的功能调用。
例如
SerialPrintf("Hello world!\r\n");
SerialPrintf("num = %d\r\n",num);
......
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2015-11-12 22:18:28 | 显示全部楼层
回复【12楼】BMN李:
---------------------------------
这么厉害,谢谢啊^_^
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
 楼主| 发表于 2015-11-13 21:43:24 | 显示全部楼层
回复【14楼】kinkun:
---------------------------------
谢谢啦。我确实这方面的基础不扎实- -
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 04:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表