C语言打印char数组十六进制值去除ffffff前缀实现两位输出
问题原因
- 你的系统中
char默认是有符号字符类型,当MacAdd中存储的字节值大于0x7F(即十进制127)时,会被识别为负数 - 可变参数函数
sprintf/printf处理整型参数时会做整型提升,负数的符号位会扩展,最终输出时就会出现高位的ffffff前缀 - 原有代码中手动追加
\0的操作是多余的,sprintf格式化完成后会自动在字符串末尾补结束符
解决方法
方法1:修改格式说明符(最简单,无需改动结构体)
使用%hhx替代%x,这个格式符会明确告诉printf只读取参数的低8位,自动忽略高位扩展内容:
// 基础写法,输出对应十六进制值 sprintf(MAC, "%hhx:%hhx", Info->MacAdd[0], Info->MacAdd[1]); // 更安全的防溢出写法,推荐使用 snprintf(MAC, sizeof(MAC), "%hhx:%hhx", Info->MacAdd[0], Info->MacAdd[1]);
如果需要保证输出始终是两位,不足两位时补前导0(比如数值为0x05时输出05而非5),可以把格式符改成%02hhx即可。
方法2:修改结构体成员类型为无符号字符
直接把MAC地址数组的类型改为unsigned char,从根源上避免符号扩展问题:
typedef struct Info { unsigned char MacAdd[2]; } Info; // 后续格式化可以直接用%x,也不会出现高位前缀 snprintf(MAC, sizeof(MAC), "%x:%x", Info->MacAdd[0], Info->MacAdd[1]);
方法3:手动做位掩码截取低8位
如果既不想改结构体也不想用%hhx(比如兼容非常老的编译器),可以手动和0xFF做与运算截取低8位:
snprintf(MAC, sizeof(MAC), "%x:%x", Info->MacAdd[0] & 0xFF, Info->MacAdd[1] & 0xFF);
内容的提问来源于stack exchange,提问作者GNK
相关产品推荐
相关产品推荐

