在struct变量中写一个字节

时间:2016-11-29 16:41:58

标签: c

我尝试使用以下代码修改我的结构的一个字节:

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的第二个参数。但它并没有改变任何事情。谁知道为什么?

谢谢!

2 个答案:

答案 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打印(这可能无法实现)。