C语言实现十进制转换成十六进制的实现(有例程),不用scanf函数,STM32 在Keil5环境_keil十进制转十六进制-程序员宅基地

技术标签: C语言  c语言  

我看了很多十进制转换十六进制的文章,几乎全部都是利用scanf()函数写的,这和我想实现的功能并不一样,因为scanf是通过键盘进行输入,我只是想将一个数组里的十进制数通过调用一个函数转换为十六进制数然后储存到另一个数组里,于是我打算自己写一个转换函数。

关于十进制转十六进制

十进制转十六进制的方法网上介绍的很多,这里简单说明一下。用十进制的数除以十六,得到的余数保留,得到的商继续除以十六,直至除到商为0为止,将先得到的余数排在最右边,后得到的按照顺序依次往左排,排完所有的余数之后,便得到了十进制对应的十六进制数。更详细的教程可以去百度。
我用的编译器是keil5,支持标准C的编译器应该均适用。
函数整体结构:
在这里插入图片描述

代码的结构很简单,就是for循环里面嵌套几个if、else if做判断,if里面用switch语句判断余数,根据余数大小来判断接下来要做的操作。
for循环的次数由你想转换多少个十进制数来定,可以创建一个数组,通过函数形参传入函数内部,case语句里面就是实现一个循环右移的操作。函数很简单,大家不要因为太长被吓到,菜鸟都能看的懂。如果编译环境一样,应该可以直接用。

代码实现

#define length_16 4
unsigned short int HexData_16[length_16];        //用于缓存16位十六进制数的区域
/* --------------十进制(16位)转换为十六进制---------------- */
void Dec2Hex_16(unsigned short int* temp)
{
    
	int i,j,m,n,x;
	unsigned short int Hex = 0xFFFF;
	unsigned short int Dec = 0;
	unsigned short int rem = 0;    //定义余数变量
	unsigned short int mer = 0;    //定义商变量
	for(i = 0;i < length_16;i++)   //有几个数要转换,length_16就等于几
	{
    
		Dec = temp[i];
		if(Dec >= 4096)
		{
    
			for(j = 0;j < 4;j++)    //大于4096的数,要对数除四次商才为0
			{
    
				rem = Dec % 16;
				mer = Dec / 16;
				Dec = mer;
				switch(rem)           //看余数为多少
				{
    
					case 0:
					{
    
						Hex &= 0xFFF0;    //如果为0,则让16进制数最后四位赋0
						Hex >>= 4;        //然后右移四位,让下一个四位在下一个循环进行运算
						Hex |= 0x0000;    //这里是实现一个循环右移的效果,其实就是就是将移除的数再赋值给最左边
						break;
					}
					case 1:
					{
    
						Hex &= 0xFFF1;
						Hex >>= 4;
						Hex |= 0x1000;
						break;
					}
					case 2:
					{
    
						Hex &= 0xFFF2;
						Hex >>= 4;
						Hex |= 0x2000;

						break;
					}
					case 3:
					{
    
						Hex &= 0xFFF3;
						Hex >>= 4;
						Hex |= 0x3000;
						break;
					}
					case 4:
					{
    
						Hex &= 0xFFF4;
						Hex >>= 4;
						Hex |= 0x4000;
						break;
					}
					case 5:
					{
    
						Hex &= 0xFFF5;
						Hex >>= 4;
						Hex |= 0x5000;
						break;
					}
					case 6:
					{
    
						Hex &= 0xFFF6;
						Hex >>= 4;
						Hex |= 0x6000;
						break;
					}
					case 7:
					{
    
						Hex &= 0xFFF7;
						Hex >>= 4;
						Hex |= 0x7000;
						break;
					}
					case 8:
					{
    
						Hex &= 0xFFF8;
						Hex >>= 4;
						Hex |= 0x8000;
						break;
					}
					case 9:
					{
    
						Hex &= 0xFFF9;
						Hex >>= 4;
						Hex |= 0x9000;
						break;
					}
					case 10:
					{
    
						Hex &= 0xFFFA;
						Hex >>= 4;
						Hex |= 0xA000;
						break;
					}
					case 11:
					{
    
						Hex &= 0xFFFB;
						Hex >>= 4;
						Hex |= 0xB000;
						break;
					}
					case 12:
					{
    
						Hex &= 0xFFFC;
						Hex >>= 4;
						Hex |= 0xC000;
						break;
					}
					case 13:
					{
    
						Hex &= 0xFFFD;
						Hex >>= 4;
						Hex |= 0xD000;
						break;
					}
					case 14:
					{
    
						Hex &= 0xFFFE;
						Hex >>= 4;
						Hex |= 0xE000;
						break;
					}
					case 15:
					{
    
						Hex &= 0xFFFF;
						Hex >>= 4;
						Hex |= 0xF000;
						break;
					}
				}
			}
		}
		else if(Dec >= 256 && Dec < 4096)
		{
    
			for(m = 0;m < 3;m++)   //这里只循环3次,因为256~4095的数除3次余数便为0,循环四次的话结果不对
			{
    
				rem = Dec % 16;
				mer = Dec / 16;
				Dec = mer;
				switch(rem)
				{
    
					case 0:
					{
    
						Hex &= 0xFFF0;
						Hex >>= 4;
						Hex |= 0x0000;
						break;
					}
					case 1:
					{
    
						Hex &= 0xFFF1;
						Hex >>= 4;
						Hex |= 0x1000;
						break;
					}
					case 2:
					{
    
						Hex &= 0xFFF2;
						Hex >>= 4;
						Hex |= 0x2000;

						break;
					}
					case 3:
					{
    
						Hex &= 0xFFF3;
						Hex >>= 4;
						Hex |= 0x3000;
						break;
					}
					case 4:
					{
    
						Hex &= 0xFFF4;
						Hex >>= 4;
						Hex |= 0x4000;
						break;
					}
					case 5:
					{
    
						Hex &= 0xFFF5;
						Hex >>= 4;
						Hex |= 0x5000;
						break;
					}
					case 6:
					{
    
						Hex &= 0xFFF6;
						Hex >>= 4;
						Hex |= 0x6000;
						break;
					}
					case 7:
					{
    
						Hex &= 0xFFF7;
						Hex >>= 4;
						Hex |= 0x7000;
						break;
					}
					case 8:
					{
    
						Hex &= 0xFFF8;
						Hex >>= 4;
						Hex |= 0x8000;
						break;
					}
					case 9:
					{
    
						Hex &= 0xFFF9;
						Hex >>= 4;
						Hex |= 0x9000;
						break;
					}
					case 10:
					{
    
						Hex &= 0xFFFA;
						Hex >>= 4;
						Hex |= 0xA000;
						break;
					}
					case 11:
					{
    
						Hex &= 0xFFFB;
						Hex >>= 4;
						Hex |= 0xB000;
						break;
					}
					case 12:
					{
    
						Hex &= 0xFFFC;
						Hex >>= 4;
						Hex |= 0xC000;
						break;
					}
					case 13:
					{
    
						Hex &= 0xFFFD;
						Hex >>= 4;
						Hex |= 0xD000;
						break;
					}
					case 14:
					{
    
						Hex &= 0xFFFE;
						Hex >>= 4;
						Hex |= 0xE000;
						break;
					}
					case 15:
					{
    
						Hex &= 0xFFFF;
						Hex >>= 4;
						Hex |= 0xF000;
						break;
					}
				}
			}
			/* 上面的for循环循环了3次,这样会导致前三个数是正常的,最后一个数是F,
				 得到的结果也是错的,所以要再右移一次,给最左边赋0 */
			Hex &= 0xFFF0;
			Hex >>= 4;
			Hex |= 0x0000;
		}
		else if(Dec >= 16 && Dec < 256)
		{
    
			for(n = 0;n < 2;n++)
			{
    
				rem = Dec % 16;
				mer = Dec / 16;
				Dec = mer;
				switch(rem)
				{
    
					case 0:
					{
    
						Hex &= 0xFFF0;
						Hex >>= 4;
						Hex |= 0x0000;
						break;
					}
					case 1:
					{
    
						Hex &= 0xFFF1;
						Hex >>= 4;
						Hex |= 0x1000;
						break;
					}
					case 2:
					{
    
						Hex &= 0xFFF2;
						Hex >>= 4;
						Hex |= 0x2000;

						break;
					}
					case 3:
					{
    
						Hex &= 0xFFF3;
						Hex >>= 4;
						Hex |= 0x3000;
						break;
					}
					case 4:
					{
    
						Hex &= 0xFFF4;
						Hex >>= 4;
						Hex |= 0x4000;
						break;
					}
					case 5:
					{
    
						Hex &= 0xFFF5;
						Hex >>= 4;
						Hex |= 0x5000;
						break;
					}
					case 6:
					{
    
						Hex &= 0xFFF6;
						Hex >>= 4;
						Hex |= 0x6000;
						break;
					}
					case 7:
					{
    
						Hex &= 0xFFF7;
						Hex >>= 4;
						Hex |= 0x7000;
						break;
					}
					case 8:
					{
    
						Hex &= 0xFFF8;
						Hex >>= 4;
						Hex |= 0x8000;
						break;
					}
					case 9:
					{
    
						Hex &= 0xFFF9;
						Hex >>= 4;
						Hex |= 0x9000;
						break;
					}
					case 10:
					{
    
						Hex &= 0xFFFA;
						Hex >>= 4;
						Hex |= 0xA000;
						break;
					}
					case 11:
					{
    
						Hex &= 0xFFFB;
						Hex >>= 4;
						Hex |= 0xB000;
						break;
					}
					case 12:
					{
    
						Hex &= 0xFFFC;
						Hex >>= 4;
						Hex |= 0xC000;
						break;
					}
					case 13:
					{
    
						Hex &= 0xFFFD;
						Hex >>= 4;
						Hex |= 0xD000;
						break;
					}
					case 14:
					{
    
						Hex &= 0xFFFE;
						Hex >>= 4;
						Hex |= 0xE000;
						break;
					}
					case 15:
					{
    
						Hex &= 0xFFFF;
						Hex >>= 4;
						Hex |= 0xF000;
						break;
					}
				}
			}
			Hex &= 0xFFF0;
			Hex >>= 4;
			Hex |= 0x0000;
			Hex &= 0xFFF0;
			Hex >>= 4;
			Hex |= 0x0000;
		}
		else if(Dec > 0 && Dec < 16)
		{
    
			for(x = 0;x < 1;x++)
			{
    
				rem = Dec % 16;
				mer = Dec / 16;
				Dec = mer;
				switch(rem)
				{
    
					case 0:
					{
    
						Hex &= 0xFFF0;
						Hex >>= 4;
						Hex |= 0x0000;
						break;
					}
					case 1:
					{
    
						Hex &= 0xFFF1;
						Hex >>= 4;
						Hex |= 0x1000;
						break;
					}
					case 2:
					{
    
						Hex &= 0xFFF2;
						Hex >>= 4;
						Hex |= 0x2000;

						break;
					}
					case 3:
					{
    
						Hex &= 0xFFF3;
						Hex >>= 4;
						Hex |= 0x3000;
						break;
					}
					case 4:
					{
    
						Hex &= 0xFFF4;
						Hex >>= 4;
						Hex |= 0x4000;
						break;
					}
					case 5:
					{
    
						Hex &= 0xFFF5;
						Hex >>= 4;
						Hex |= 0x5000;
						break;
					}
					case 6:
					{
    
						Hex &= 0xFFF6;
						Hex >>= 4;
						Hex |= 0x6000;
						break;
					}
					case 7:
					{
    
						Hex &= 0xFFF7;
						Hex >>= 4;
						Hex |= 0x7000;
						break;
					}
					case 8:
					{
    
						Hex &= 0xFFF8;
						Hex >>= 4;
						Hex |= 0x8000;
						break;
					}
					case 9:
					{
    
						Hex &= 0xFFF9;
						Hex >>= 4;
						Hex |= 0x9000;
						break;
					}
					case 10:
					{
    
						Hex &= 0xFFFA;
						Hex >>= 4;
						Hex |= 0xA000;
						break;
					}
					case 11:
					{
    
						Hex &= 0xFFFB;
						Hex >>= 4;
						Hex |= 0xB000;
						break;
					}
					case 12:
					{
    
						Hex &= 0xFFFC;
						Hex >>= 4;
						Hex |= 0xC000;
						break;
					}
					case 13:
					{
    
						Hex &= 0xFFFD;
						Hex >>= 4;
						Hex |= 0xD000;
						break;
					}
					case 14:
					{
    
						Hex &= 0xFFFE;
						Hex >>= 4;
						Hex |= 0xE000;
						break;
					}
					case 15:
					{
    
						Hex &= 0xFFFF;
						Hex >>= 4;
						Hex |= 0xF000;
						break;
					}
				}
			}
			Hex &= 0xFFF0;
			Hex >>= 4;
			Hex |= 0x0000;
			Hex &= 0xFFF0;
			Hex >>= 4;
			Hex |= 0x0000;
			Hex &= 0xFFF0;
			Hex >>= 4;
			Hex |= 0x0000;
		}
		else
		{
    
			Hex = 0x0000;
		}
		HexData_16[i] = Hex;
	}
	printf("%04x,%04x,%04x,%04x\r\n",HexData_16[0],HexData_16[1],HexData_16[2],HexData_16[3]);
}

在keil里如果要用printf()函数,还需要重定义,从定义函数如下:

#include "stdio.h"   //这里要声明stdio.h头文件,不然printf函数会显示未定义,全文中声明一次即可,建议在最顶部声明
/* --------------------fputc重定义函数----------------------- */
int fputc(int ch,FILE *f)
{
    
	HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,HAL_MAX_DELAY);
	return ch;
}

如果有更好的方法,欢迎交流。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Deheng_Kong/article/details/115550227

智能推荐

分布式光纤传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告_预计2026年中国分布式传感器市场规模有多大-程序员宅基地

文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大

07_08 常用组合逻辑电路结构——为IC设计的延时估计铺垫_基4布斯算法代码-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码

OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版

关于美国计算机奥赛USACO,你想知道的都在这_usaco可以多次提交吗-程序员宅基地

文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗

MySQL存储过程和自定义函数_mysql自定义函数和存储过程-程序员宅基地

文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程

半导体基础知识与PN结_本征半导体电流为0-程序员宅基地

文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0

随便推点

【Unity3d Shader】水面和岩浆效果_unity 岩浆shader-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader

广义线性模型——Logistic回归模型(1)_广义线性回归模型-程序员宅基地

文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型

HTML+CSS大作业 环境网页设计与实现(垃圾分类) web前端开发技术 web课程设计 网页规划与设计_垃圾分类网页设计目标怎么写-程序员宅基地

文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁_.net dll 全局目录-程序员宅基地

文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录

BRIEF特征点描述算法_breif description calculation 特征点-程序员宅基地

文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点

房屋租赁管理系统的设计和实现,SpringBoot计算机毕业设计论文_基于spring boot的房屋租赁系统论文-程序员宅基地

文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文