[英]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.aNum
或r->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.