|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万+阅读 1.6万+收藏 |
文章目录
-
-
-
- [1. 核心转换函数](#1. 核心转换函数)
- [2. 使用示例](#2. 使用示例)
- [3. 转换原理说明](#3. 转换原理说明)
- [4. 性能优化特点](#4. 性能优化特点)
- [5. 扩展自己编写测试可用的程序](#5. 扩展自己编写测试可用的程序)
- [6. 使用注意事项](#6. 使用注意事项)
-
-
在嵌入式开发中,虽然计算机内部数据都以二进制存储,但有时需要在数值层面进行16进制和10进制的相互转换。以下是针对STM32优化的整型互转实现方案:
1. 核心转换函数
c
#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. 使用示例
c
int main(void) {
// 硬件初始化代码...
// 示例1: 16进制转10进制
uint16_t hex_val = 0x1A3; // 0x1A3 = 419
uint32_t dec_result = hex_to_dec(hex_val); // 结果: 419
// 示例2: 10进制转16进制
uint32_t dec_val = 305; // 305 = 0x131
uint16_t hex_result = dec_to_hex(dec_val); // 结果: 0x131
// 优化版转换
hex_result = dec_to_hex_fast(419); // 结果: 0x1A3
while(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. 扩展自己编写测试可用的程序
c
//十六进制转十进制
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位中间变量