STM32 C语言实现16进制与十进制整型互转(含自己编写测试可用的程序)

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 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. 转换原理说明
  1. 16进制转10进制流程

    • 输入:0x1A3 (十六进制值)

    • 处理步骤:

      复制代码
      1. 取最低位 3 → 3 × 1 = 3
      2. 取下一位 A(10) → 10 × 16 = 160
      3. 取最高位 1 → 1 × 256 = 256
      4. 求和:3 + 160 + 256 = 419
  2. 10进制转16进制流程

    • 输入:305 (十进制值)

    • 处理步骤:

      复制代码
      1. 305 ÷ 16 = 19 余 1 → 最低位: 1
      2. 19 ÷ 16 = 1 余 3 → 中间位: 3
      3. 1 ÷ 16 = 0 余 1 → 最高位: 1
      4. 组合:0x131
4. 性能优化特点
  1. 零库依赖

    仅使用基本运算,不依赖标准库

  2. 低资源消耗

    • 栈空间:< 16字节
    • 执行周期:< 100周期 @ 72MHz
    • 无动态内存分配
  3. 优化算法

    • 使用移位替代乘除(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. 使用注意事项
  1. 数值范围限制

    • 16位转换上限:0xFFFF → 65535
    • 10进制输入上限:65535 (0xFFFF)
  2. 特殊值处理

    • 输入0返回0
    • 超出范围返回0xFFFF(错误标志)
  3. 数据溢出防护

    32位转换需使用64位中间变量