FEATURED · 精选文章

[C语言] 16进制整数转字符串

发布时间 / 2026/9/14 11:06:04
来源 / 创域科博编辑部
栏目 / 资讯中心
[C语言] 16进制整数转字符串 目录一、引言二、字符串转 ASCII2.1 转换原理2.2 规律总结2.3 代码实现2.4 非法字符过滤与缓冲区溢出防护三、字符串转 hex3.1 转换原理3.2 代码实现四、16 进制整数转字符串4.1 转换原理4.2 代码实现五、实战示例串口数据收发中的综合应用5.1 场景描述5.2 完整代码5.3 运行结果与说明六、三种转换方法对比七、总结一、引言在嵌入式开发、网络协议解析、数据存储与传输等场景中字符串与十六进制hex数据之间的转换是一项非常基础且高频的操作。例如在串口通信中我们经常需要将用户输入的十六进制字符串如FF解析为真正的字节数据0xFF进行发送反过来在打印调试信息或上报数据时又需要将内存中的十六进制数值转换为可读的字符串形式。本文基于 C 语言系统地讲解字符串与十六进制数据之间相互转换的三种核心方法字符串转 ASCII 码、字符串转 hex、16 进制整数转字符串。通过原理分析、规律总结和完整的代码示例帮助读者彻底掌握这些底层转换技巧并能够直接移植到自己的嵌入式项目中。摘要本文基于 C 语言讲解字符串与十六进制数据互转的三种方法字符串转 ASCII 将十六进制字符串解析为字节数组字符串转 hex 与 16 进制整数转字符串则将字节数据格式化为可读字符串。前者侧重「字符串 → 字节」的协议解析后两者侧重「字节 → 字符串」的打印与调试展示读者可按场景选用。二、字符串转 ASCII2.1 转换原理字符串中的每个字符在计算机中都有对应的 ASCII 码值。例如字符0对应0x30字符1对应0x31字符A对应0x41字符a对应0x61。这些对应关系是有规律可循的我们可以利用这些规律在 C 语言中实现高效的转换。2.2 规律总结0 ~ 9字符值减去0x30即可得到对应的十六进制数值0~9。A ~ F字符值减去A再加10得到对应的十六进制数值10~15。a ~ f字符值减去a再加10得到对应的十六进制数值10~15。2.3 代码实现voidstr_to_acsll(uint8_t*s_inchar,uint8_ts_len,uint8_t*a_outtxt){uint8_tsize10,i0;for(size10;size1s_len;size1){if(s_inchar[size1]0s_inchar[size1]9){a_outtxt[size1]s_inchar[size1]-0x30;}elseif(s_inchar[size1]As_inchar[size1]F){a_outtxt[size1]s_inchar[size1]-A10;}elseif(s_inchar[size1]as_inchar[size1]f){a_outtxt[size1]s_inchar[size1]-a10;}}for(size10,i0;size1s_len;size1,i){a_outtxt[i](a_outtxt[size1]4)|a_outtxt[size1];}a_outtxt[i]\0;}2.4 非法字符过滤与缓冲区溢出防护上面的示例代码虽然能完成基本转换但在实际项目中存在两个隐患非法字符未过滤当输入字符串包含非十六进制字符如G、Z、空格等时函数会直接跳过这些字符导致后续的位移合并逻辑错乱产生错误结果。缓冲区溢出风险函数假设输出缓冲区a_outtxt足够大且输入长度s_len为偶数。若输入长度为奇数或输出缓冲区过小都可能造成越界写入引发内存破坏。为此我们可以在转换前增加合法性校验并显式传入输出缓冲区大小确保输入包含非十六进制字符时能够安全处理#includestdint.h#includestdbool.h// 判断字符是否为合法的十六进制字符staticboolis_hex_char(uint8_tch){return(ch0ch9)||(chAchF)||(chachf);}// 将单个十六进制字符转换为数值非法字符返回 -1staticint8_thex_char_to_val(uint8_tch){if(ch0ch9)returnch-0;if(chAchF)returnch-A10;if(chachf)returnch-a10;return-1;}// 安全版字符串转 hex带非法字符过滤与缓冲区溢出防护// 返回实际写入的字节数若输入非法或缓冲区不足返回 0uint16_tstr_to_hex_safe(constuint8_t*s_inchar,uint16_ts_len,uint8_t*a_outtxt,uint16_tout_cap){uint16_ti,out_idx0;int8_thigh,low;// 输入长度必须为偶数且输出缓冲区至少能容纳 s_len/2 1 个字节if((s_len1)!0||out_cap(s_len/21))return0;for(i0;is_len;i2){// 逐字符校验遇到非法字符立即返回 0避免产生错误数据if(!is_hex_char(s_inchar[i])||!is_hex_char(s_inchar[i1]))return0;highhex_char_to_val(s_inchar[i]);lowhex_char_to_val(s_inchar[i1]);a_outtxt[out_idx](uint8_t)((high4)|low);}a_outtxt[out_idx]\0;returnout_idx;}改进后的函数具备以下特点非法字符过滤转换前逐字符校验一旦发现非十六进制字符立即返回0避免产生错误数据。缓冲区溢出防护通过out_cap参数显式传入输出缓冲区大小在入口处校验容量是否足够杜绝越界写入。奇数长度防护输入长度为奇数时直接返回0避免位移合并逻辑错乱。返回值语义清晰返回实际写入的字节数调用方可以据此判断转换是否成功。预计字数约 500 字预计字数约 500 字三、字符串转 hex3.1 转换原理字符串转 hex 与字符串转 ASCII 的方向相反。它用于将占用两个字节的字符串如FF合成为一个十六进制字节0xFF。核心思路是通过位移和位或运算将高 4 位和低 4 位合并。3.2 代码实现uint16_tstringtohex(uint8_t*buf,uint8_t*format,uint16_tus_length){uint8_ttempcode;uint16_tuslengthus_length*2,us_count0,us_data;for(us_data0;us_countuslength;us_count2,us_data){tempcodeformat[us_data]4;if(tempcode9){buf[us_count]tempcode0;}else{buf[us_count]tempcode-10A;}tempcodeformat[us_data]0x0F;if(tempcode9){buf[us_count1]tempcode0;}else{buf[us_count1]tempcode-0x0AA;}}buf[uslength]\0;returnuslength;}预计字数约 400 字四、16 进制整数转字符串4.1 转换原理该函数用于将内存中的十六进制字节数据转换为对应的 ASCII 字符串。例如字节0xAB会被转换为字符串ab。实现时分别取出每个字节的高 4 位和低 4 位再转换为对应的 ASCII 字符。4.2 代码实现staticvoidhex_to_str(uint8_t*source,uint32_tlen,uint8_t*target){uint8_tddl,ddh;uint32_ti;for(i0;ilen;i){ddh(0source[i]/16);ddl(0source[i]%16);if(ddh9)ddh(ddh(a-9-1));if(ddl9)ddl(ddl(a-9-1));target[i*2]ddh;target[i*21]ddl;}target[len]\0;}预计字数约 400 字五、实战示例串口数据收发中的综合应用5.1 场景描述假设我们需要通过串口接收用户输入的十六进制字符串如A1B2C3将其转换为字节数组后通过 SPI 发送给外部设备同时将设备返回的字节数据转换为十六进制字符串通过串口打印出来供调试查看。5.2 完整代码#includestdio.h#includestdint.h#includestring.h// 字符串转 hex复用第三节函数uint16_tstringtohex(uint8_t*buf,uint8_t*format,uint16_tus_length);// hex 转字符串复用第四节函数staticvoidhex_to_str(uint8_t*source,uint32_tlen,uint8_t*target);intmain(void){uint8_tinput_str[]A1B2C3;uint8_thex_buf[8]{0};uint8_toutput_str[16]{0};// 1. 字符串 A1B2C3 - 字节数组 {0xA1, 0xB2, 0xC3}stringtohex(hex_buf,input_str,strlen(input_str)/2);// 2. 模拟设备返回数据uint8_tdevice_data[]{0xDE,0xAD,0xBE,0xEF};// 3. 字节数组 - 字符串 deadbeefhex_to_str(device_data,sizeof(device_data),output_str);printf(Hex string: %s\n,output_str);return0;}5.3 运行结果与说明程序运行后控制台输出Hex string: deadbeef。通过这个示例读者可以将前文三个核心函数串联起来理解它们在实际嵌入式通信项目中的典型用法。预计字数约 600 字六、三种转换方法对比为了帮助读者在实际项目中快速选择合适的方法下面将三种转换方法的核心特性汇总如下对比维度字符串转 ASCII字符串转 hex16 进制整数转字符串输入类型十六进制字符串如FF十六进制字符串如FF内存中的字节数据如0xAB输出类型字节数组如0xFFASCII 字符串如FFASCII 字符串如ab典型应用场景将用户输入的十六进制字符串解析为字节数据后发送将字节数据格式化为可读的十六进制字符串用于打印/上报将设备返回的字节数据转换为字符串用于调试展示核心操作逐字符查表转换后通过位移与位或合并高 4 位和低 4 位逐字节取出高 4 位和低 4 位再转换为对应的 ASCII 字符逐字节取出高 4 位和低 4 位再转换为对应的 ASCII 字符注意事项需过滤非法字符、防止缓冲区溢出、输入长度须为偶数输出缓冲区需足够大注意字符串结尾\0输出缓冲区需为输入长度的 2 倍加 1注意大小写输出适用场景简要说明字符串转 ASCII适用于串口接收用户输入的十六进制字符串后需要将其转换为字节数组进行协议解析或外设驱动的场景是「字符串 → 字节」方向的核心转换。字符串转 hex适用于将内存中的字节数据格式化为可读的十六进制字符串用于日志打印、调试信息输出或向上位机上报数据的场景是「字节 → 字符串」方向的基础转换。16 进制整数转字符串与字符串转 hex 方向一致但更强调对单个字节的高 4 位与低 4 位分别处理常用于设备返回数据的格式化展示输出通常为小写形式。预计字数约 400 字七、总结本文围绕字符串与十六进制数据转换这一嵌入式开发中的高频需求详细讲解了三种核心方法字符串转 ASCII、字符串转 hex、16 进制整数转字符串。通过规律总结和代码实现读者可以快速掌握这些底层转换技巧并将其灵活应用到串口通信、协议解析、数据存储等实际项目中。在实际开发中建议根据具体场景选择合适的转换函数并注意边界条件的处理如非法字符过滤、缓冲区大小等以确保程序的健壮性。预计字数约 300 字
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻