使用下面的代码buf
cpp
dprt("data: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
明明是一个字节一个字节的打,打出来的数据有些却是4个字节
cpp
0xffffffff 0xffffffff 0xffffffff 0x7f 0xffffffff 0x7f
0xffffffff 0x7f 0xffffffff 0x7f 0xffffffff 0xffffffff
0xffffffff 0xffffffff 0xffffffff 0x7f 0xffffffff 0x7f
0x00 0x00 0x00 0x00 0x00 0x00
就很奇怪
可能的原因
ch
的类型不匹配 :- 如果
ch
被声明为char
类型,并且该字符的值在有符号char
范围内表示为负数(例如,char
是有符号的,并且ch
的值是-1
),那么在传递给printf
时,可能会被提升为int
类型,并进行符号扩展。 - 在许多实现中,
char
默认是有符号的,因此-1
会被提升为int
类型的0xffffffff
(在 32 位系统上)。
- 如果
- 格式说明符不匹配 :
%02x
格式说明符期望一个unsigned int
类型的参数(或至少一个可以隐式转换为unsigned int
的参数),但char
类型会被提升为int
。- 如果
char
是有符号的且为负值,符号扩展会导致不期望的结果。
解决:
cpp
//char* buf = (char*)param1;
uint32_t* data = (uint32_t*)param1;
//dprt("data: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
dprt("data: 0x%08x 0x%08x", data[0], data[1]);
这样打印就正常了
cpp
data: 0x837f037e 0x037f037f
data: 0x7e31fe31 Oxfe31fe31
data: Oxf4f674f6 0xf4f6f4f6
data: Ox797af97a 0x797a797a
data: Oxfb737b73 0xfb73fb73
data: 0x84850485 0x84858485