十六进制字符串转uint8_t数组正确性验证及打印异常问题咨询
问题根因
- 格式符使用错误:
%" PRIu8是用于打印单个uint8_t类型数值的格式宏,你直接传入数组名作为参数时,数组名会自动退化为指向数组首地址的指针,printf会将该内存地址强制按uint8_t规则截断输出,你看到的奇怪值就是数组首地址截断后的结果。 - 直接打印数组的逻辑错误:uint8_t数组存储的是纯字节序列,其中可能包含值为
\0的字节,即便误用%s打印也会因为遇到\0就终止输出,无法得到完整内容。
修复方案
遍历uint8_t数组的每个元素逐个打印即可,示例代码如下:
printf("[SKT]\tByte Array: "); for (int i = 0; i < uint_size; i++) { // 按十六进制打印每个字节,每个字节占2位,不足补前导0 printf("%02" PRIx8 " ", uint8_payload[i]); } printf("\n");
额外注意点
你调用convert_hex时传入的count参数为socket接收的字符串长度n,但十六进制字符串每2个字符对应1个字节,实际转换后的字节数应为n/2,建议传入sizeof(uint8_payload)和n/2的最小值作为count参数更安全,避免数组越界。
内容的提问来源于stack exchange,提问作者Ferrari Service
相关产品推荐
相关产品推荐

