【发布时间】:2014-05-18 12:14:54
【问题描述】:
我已经用数据填充了我的结构struct addrinfo **res:
err = getaddrinfo(argv[1], NULL, &hints, &res);
如果我想打印 IP 地址,我可以使用
addr.s_addr = ((struct sockaddr_in *)(res->ai_addr))->sin_addr.s_addr;
printf("ip address : %s\n", inet_ntoa(addr));
这将打印例如10.111.1.11。但我需要十六进制格式的 IP,即0A6F010B。
我想出了以下内容,它确实会以十六进制格式打印 IP:
for (i=0; i<32; i=i+8)
printf("%02X",(addr.s_addr>>i) % 256) ;
但在我看来,我的方法是不必要的复杂。我需要两个步骤(两次转换)。如果可能的话,我想简化我的代码,并直接从 res->ai_addr->sa_data 打印十六进制 IP(不必先将数据存储在 addr.s_addr 中)。
我知道res->ai_addr->sa_data 中有数据。我可以打印它:
for (i=0; i<14; i++)
printf("%d", res->ai_addr->sa_data[i]);
printf("\n");
我得到以下输出(对应于10.111.1.11):
001011111100000000
但是格式不像前面的例子那么简单。例如172.25.0.31 我得到这个输出:
00-842503100000000
所以我的问题:
如何将这些乱码转换为十六进制 IP 地址?
【问题讨论】:
-
如果你想要十六进制,你为什么使用
%d,这是十进制? -
你也迷路了。你的
res应该是struct addrinfo *。