C语言如何将uint8_t十六进制数组转换为保留前导零的8位字符串
修正后可运行代码
#include <stdio.h> #include <stdint.h> int main(){ // 4个uint8_t每个转2位十六进制共8位,+1位存字符串结束符'\0',总长度至少9 char dene[9]; uint8_t hex_in[4]={0x10,0x01,0x00,0x11}; // %02x:0表示不足位补前导零,2表示固定输出2位 sprintf(dene, "%02x%02x%02x%02x", hex_in[0], hex_in[1], hex_in[2], hex_in[3]); printf("dene %s\n",dene); return 0; }
运行后输出结果为dene 10010011,符合需求。
核心修改点说明
- 输出格式符调整为
%02x:%x是十六进制输出的基础格式,前缀02表示强制输出2位,位数不足时用前导零补齐,即可解决前导零被省略的问题。如果需要输出大写的十六进制字符,将x替换为X即可。 - 调整存储结果的字符数组长度:原有代码中
dene仅分配了2字节的空间,完全无法容纳8位十六进制字符+1位字符串结束符,会触发缓冲区越界的未定义行为,必须将长度调整为至少9字节。 - 若要提升代码安全性,可将
sprintf替换为snprintf,写法如下:
可以避免因为数组长度计算错误导致的缓冲区溢出问题。snprintf(dene, sizeof(dene), "%02x%02x%02x%02x", hex_in[0], hex_in[1], hex_in[2], hex_in[3]);
内容的提问来源于stack exchange,提问作者mehmet
相关产品推荐
相关产品推荐

