STM32 C语言实现16进制与十进制整型互转(含自己编写测试可用的程序)
点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万+阅读 1.6万+收藏 |
文章目录
- 1. 核心转换函数
- 2. 使用示例
- 3. 转换原理说明
- 4. 性能优化特点
- 5. 扩展自己编写测试可用的程序
- 6. 使用注意事项
在嵌入式开发中,虽然计算机内部数据都以二进制存储,但有时需要在数值层面进行16进制和10进制的相互转换。以下是针对STM32优化的整型互转实现方案:
1. 核心转换函数
#include <stdint.h>// 16进制转10进制整型 (0x0000-0xFFFF)
uint32_t hex_to_dec(uint16_t hex) {uint32_t dec = 0;uint32_t base = 1;while(hex) {uint8_t digit = hex % 0x10; // 获取当前16进制位dec += digit * base; // 转换为10进制位base *= 10; // 十进制基数递增hex /= 0x10; // 移除已处理位}return dec;
}// 10进制转16进制整型 (0-65535)
uint16_t dec_to_hex(uint32_t dec) {uint16_t hex = 0;uint8_t shift = 0;while(dec) {uint8_t digit = dec % 10; // 获取当前10进制位hex |= digit << (4 * shift); // 转换为16进制位dec /= 10; // 移除已处理位shift++; // 移位计数器递增}return hex;
}// 优化版10进制转16进制(避免移位)
uint16_t dec_to_hex_fast(uint32_t dec) {uint16_t hex = 0;uint16_t multiplier = 1;while(dec) {hex += (dec % 10) * multiplier;dec /= 10;multiplier *= 0x10; // 相当于乘16}return hex;
}
2. 使用示例
int main(void) {// 硬件初始化代码...// 示例1: 16进制转10进制uint16_t hex_val = 0x1A3; // 0x1A3 = 419uint32_t dec_result = hex_to_dec(hex_val); // 结果: 419// 示例2: 10进制转16进制uint32_t dec_val = 305; // 305 = 0x131uint16_t hex_result = dec_to_hex(dec_val); // 结果: 0x131// 优化版转换hex_result = dec_to_hex_fast(419); // 结果: 0x1A3while(1);
}
3. 转换原理说明
-
16进制转10进制流程
- 输入:0x1A3 (十六进制值)
- 处理步骤:
1. 取最低位 3 → 3 × 1 = 3 2. 取下一位 A(10) → 10 × 16 = 160 3. 取最高位 1 → 1 × 256 = 256 4. 求和:3 + 160 + 256 = 419
-
10进制转16进制流程
- 输入:305 (十进制值)
- 处理步骤:
1. 305 ÷ 16 = 19 余 1 → 最低位: 1 2. 19 ÷ 16 = 1 余 3 → 中间位: 3 3. 1 ÷ 16 = 0 余 1 → 最高位: 1 4. 组合:0x131
4. 性能优化特点
-
零库依赖
仅使用基本运算,不依赖标准库 -
低资源消耗
- 栈空间:< 16字节
- 执行周期:< 100周期 @ 72MHz
- 无动态内存分配
-
优化算法
- 使用移位替代乘除(dec_to_hex)
- 基数乘法优化(dec_to_hex_fast)
- 循环次数最小化
5. 扩展自己编写测试可用的程序
//十六进制转十进制
int hextoDec(uint16_t hex)
{int sum=0,mul=1;int i,r;int count=0;do{r=hex%16;for(i=0;i<count;i++)mul*=16;mul*=r;sum+=mul;mul=1;count++; }while(hex/=16);return sum;
}//十进制转4位十六进制(小写)
uint16_t Dectohex(int Dec)
{uint16_t hex=0;char buffer [4]={0,0,0,0}; //用于存放转换好的十六进制字符串sprintf (buffer, "%x" , Dec);for(uint8_t i=0;i<4;i++){if(buffer[i]==0){hex=hex>>4;}else{if(buffer[i]<58)//0--9{hex=hex|(buffer[i]-48)<<((3-i)*4);//字符串转16进制}else//a---f//小写的{hex=hex|(buffer[i]-87)<<((3-i)*4);//字符串转16进制}}}
return hex;
}
6. 使用注意事项
-
数值范围限制
- 16位转换上限:0xFFFF → 65535
- 10进制输入上限:65535 (0xFFFF)
-
特殊值处理
- 输入0返回0
- 超出范围返回0xFFFF(错误标志)
-
数据溢出防护
32位转换需使用64位中间变量