我正在尝试在Assembly中编写我的C套接字代码(只是有点无聊并且认为它是一个有趣的练习)并且在尝试创建sockaddr_in
结构的过程中我编写了这个小程序:
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
void showbytes(char *c, size_t len) {
size_t i;
for (i = 0; i < len; i++)
printf("byte #%lu -> %x\n", i, c[i]);
}
int main(int argc, char* argv[]) {
struct sockaddr_in q;
bzero(&q, sizeof(q));
q.sin_family = 0x02;
q.sin_port = htons(0x1f90);
q.sin_addr.s_addr = htonl(INADDR_ANY);
union {
struct sockaddr_in sai;
char c[sizeof(struct sockaddr_in)];
} un;
un.sai = q;
showbytes(un.c, sizeof(struct sockaddr_in));
return 0;
}
我根本不了解的是输出如下:
byte #0 -> 2
byte #1 -> 0
byte #2 -> 1f
byte #3 -> ffffff90
byte #4 -> 0
byte #5 -> 0
byte #6 -> 0
byte #7 -> 0
byte #8 -> 0
byte #9 -> 0
byte #10 -> 0
byte #11 -> 0
byte #12 -> 0
byte #13 -> 0
byte #14 -> 0
byte #15 -> 0
为什么字节#3显示为4个字节?我检查了sizeof(in_port_t)
,它肯定是2个字节,但即便是这个问题。 char
应该只有1个字节..我想我在这里缺少一些相当大的东西。
答案 0 :(得分:4)
您缺少char
已在您的实现上签名,而负值(解释为unsigned int(对于%x
))是一个很大的值。您可能还会遗漏您无法将单字节值传递给变量函数(如printf) - 整数值始终会提升为至少int
或unsigned int
。
如果使用gcc或clang进行编译,请使用-funsigned-char
使char
类型无符号。那么这个问题就不会发生了。