如何打印出结构中成员的第一个和第二个字节?
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
.
您可以使用转换将成员的地址转换为其第一个字节的地址(内存中的相同位置但 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]);
如何 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
.
您可以使用转换将成员的地址转换为其第一个字节的地址(内存中的相同位置但 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]);