我只是将两个字节组合成一个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
只是组合字节,而data
是uint8_t
的数组。令我困惑的是,有时它打印16位,我只告诉它打印8(如上所述)。
我可以通过使用0xFF
掩盖字节来轻松隐藏此问题,但我真的不明白为什么甚至会发生这种情况。我还不确定这是printf
是否存在问题,或者我的数组是否被错误地解释了?
编辑:
更详细一点,数据是通过无线电链路发送的,在传输方面,我解构了数据包,在发送之前一切都完好无损。有硬件CRC和链接是好的,所以它不能只是错误。数据声明如下(对每个回调函数都是静态的)
some_callback() {
static uint8_t data[128];
...
}
我开始怀疑这可能是我使用的嵌入式操作系统中的一些模糊错误(Contiki)。
答案 0 :(得分:0)
使用匹配的printf说明符。
uint8_t
为PRIx8
,uint16_t
为PRIx16
等。
#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
。