我尝试使用以下代码修改我的结构的一个字节:
struct example *dev;
PRINT_OPAQUE_STRUCT(dev);
sprintf((char*) dev + 24, "%x",1);
PRINT_OPAQUE_STRUCT(dev);
PRINT_OPAQUE_STRUCT只是打印结构的内容,并在另一个主题中定义: Print a struct in C
该程序的输出是:
d046f64f20b3fb4f00000000e047f64f00000000ffffffff的 00 0000 d046f64f20b3fb4f00000000e047f64f00000000ffffffff的 31 0000
我不知道为什么我有价值" 31"写的而不是价值" 01"如所想。我试图用"%01x"替换sprintf的第二个参数。但它并没有改变任何事情。谁知道为什么?
谢谢!
答案 0 :(得分:3)
好吧,您将值1
格式化为字符串。这是sprintf
的作用。 0x31
是字符'1'
的字符代码。如果您只想将字节值0x01
写入结构中,那么您就不需要sprintf
。就这样做:
*((char*)dev + 24) = 1;
或(相同,但语法略有不同):
((char*)dev)[24] = 1;
另请注意,与one comment below一样,sprintf
不会只写一个字节。由于它写了一个字符串,并且C字符串以空值终止,它也会在'\0'
之后写一个空字符(0x00
,'1'
)。
答案 1 :(得分:1)
我不知道为什么我写了“31”的值,而不是想要的值“01”。
您看到31
的原因是您的函数链解释了值1
两次:
sprintf
将其解释为表示十六进制数字的字符PRINT_OPAQUE_STRUCT
再次解释该值,现在为十六进制数基本上,sprintf
会将1
转换为其字符表示形式'1'
。在您的系统上,其代码为0x31
,因此您获得的输出。
您需要删除这两种解释中的一种才能使代码打印1
。要删除第一个解释,只需将1
指定给指针,如下所示:
((char*)dev)[24] = 1;
要删除第二种解释,请在%c
中使用%x
代替PRINT_OPAQUE_STRUCT
打印(这可能无法实现)。