繁体   English   中英

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

[英]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

您可以将该成员的地址转换为其第一个字节的地址(memory 中的相同位置,但 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 的流就是为此而设计的; 当遇到换行符时,行缓冲的 stream 将向设备发送数据。 因此,将其放在一行的末尾可确保立即发送该行。 如果是在开头,而结尾没有换行,则在程序执行其他操作之前,该行可能不会发送到 output 设备。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM