printf格式说明符打印额外的十六进制数字

时间:2016-01-09 11:22:40

标签: c

我只是将两个字节组合成一个16位字,但有时我会得到一个非常意外的输出。

printf("TIME: 0x%02x 0x%02x = 0x%04x\r\n",data[2],data[3],rxTime);

$ TIME: 0x01 0xff87 = 0xff87
$ TIME: 0x03 0x37 = 0x0337

此处rxTime只是组合字节,而datauint8_t的数组。令我困惑的是,有时它打印16位,我只告诉它打印8(如上所述)。

我可以通过使用0xFF掩盖字节来轻松隐藏此问题,但我真的不明白为什么甚至会发生这种情况。我还不确定这是printf是否存在问题,或者我的数组是否被错误地解释了?

编辑:

更详细一点,数据是通过无线电链路发送的,在传输方面,我解构了数据包,在发送之前一切都完好无损。有硬件CRC和链接是好的,所以它不能只是错误。数据声明如下(对每个回调函数都是静态的)

some_callback() {
    static uint8_t data[128];
    ...
}

我开始怀疑这可能是我使用的嵌入式操作系统中的一些模糊错误(Contiki)。

1 个答案:

答案 0 :(得分:0)

使用匹配的printf说明符。

uint8_tPRIx8uint16_tPRIx16等。

#include <inttypes.h>

printf("TIME: 0x%02" PRIx8 " 0x%02" PRIx8 " = 0x%04 " PRIx16 "\r\n",
   data[2], data[3], rxTime);

PRIx8可能定义为"hhx",它会在打印前指定printf()将参数强制转换为unsigned char