如何打印出结构中成员的第一个和第二个字节?

How can I print out the first and second byte of a member inside a struct?

如何 printf() 在一行中输出结构内成员的第一个和第二个字节?

//example
int aNum=513;

int main(){
  printf("\n %02i %02i",((char*)&aNum)[0],((char*)&aNum)[1]); // --> 01 02
}

如何在结构的成员中执行与上述相同的操作?

struct test {
  int aNum;
};
int main(){
 struct test * r;
   r->aNum=513;

  printf("\n %02i %02i",??,??);
}

在打印结构成员之前,您需要有一个结构。 struct test * r; 不提供结构;它提供了一个指向结构的指针。

您可以使用 struct test s; 创建结构。如果要使用指向它的指针,则可以使用 struct test *r = &s;。然后 r->aNum=513; 将在其中存储一个值。

该结构的成员是 s.aNumr->aNum。该成员的地址是 &s.aNum&r->aNum.

您可以使用转换将成员的地址转换为其第一个字节的地址(内存中的相同位置但 C 语义中的不同类型):(unsigned char *) &s.aNum(unsigned char *) &r->aNum。请注意,在使用编码对象的字节时,通常应使用 unsigned char 而不是 char,以避免在 char 已签名的情况下产生不良影响。

给定一个 unsigned char 的地址,您可以使用数组下标从该地址访问 0 或 1 字节的字节,因此 ((unsigned char *) &s.aNum)[0]((unsigned char *) &r->aNum)[0] 用于初始字节或 ((unsigned char *) &s.aNum)[1]((unsigned char *) &r->aNum)[1] 下一个。

您的 printf 应该使用超过 2 的字段宽度,因为字节可以超过两位小数。 (通常在检查原始字节时,我们使用十六进制而不是十进制。)

您可以打印两个字节:

printf("%03i %03i\n", ((unsigned char *) &r->aNum)[0], ((unsigned char *) &r->aNum)[1]);

您应该更喜欢将换行符放在行尾,而不是行首。 C 的流就是为此而设计的;当遇到换行符时,行缓冲流将向设备发送数据。所以把它放在一行的末尾可以确保立即发送该行。如果它在开头,并且末尾没有换行符,那么在程序执行其他操作之前,该行可能不会发送到输出设备。

要以十六进制打印,请使用:

printf("%02hhx %02hhx\n", ((unsigned char *) &r->aNum)[0], ((unsigned char *) &r->aNum)[1]);