我正在准备一个测验,我有一个强烈的怀疑,我的任务可能是实现这样一个功能。基本上,给定一个采用网络表示法的IP地址,我们如何将其从32位整数转换为点分十进制表示法(类似于155.247.182.83)的字符串?显然,我们也不能使用任何类型的inet函数……我被难住了!
发布于 2009-11-05 21:02:10
这里有一个简单的方法:(ip >> 8)
、(ip >> 16)
和(ip >> 24)
将第二、第三和第四个字节移动到低位字节,而& 0xFF
在每一步中隔离最低有效字节。
void print_ip(unsigned int ip)
{
unsigned char bytes[4];
bytes[0] = ip & 0xFF;
bytes[1] = (ip >> 8) & 0xFF;
bytes[2] = (ip >> 16) & 0xFF;
bytes[3] = (ip >> 24) & 0xFF;
printf("%d.%d.%d.%d\n", bytes[3], bytes[2], bytes[1], bytes[0]);
}
在第一步中有一个隐含的bytes[0] = (ip >> 0) & 0xFF;
。
使用snprintf()
将其打印为字符串。
发布于 2009-11-05 21:11:42
另一种方法:
union IP {
unsigned int ip;
struct {
unsigned char d;
unsigned char c;
unsigned char b;
unsigned char a;
} ip2;
};
...
char ips[20];
IP ip;
ip.ip = 0xAABBCCDD;
sprintf(ips, "%x.%x.%x.%x", ip.ip2.a, ip.ip2.b, ip.ip2.c, ip.ip2.d);
printf("%s\n", ips);
发布于 2009-11-05 20:53:00
提示:将32位整数分解为4个8位整数,并打印出来。
类似的内容(未编译,YMMV):
int i = 0xDEADBEEF; // some 32-bit integer
printf("%i.%i.%i.%i",
(i >> 24) & 0xFF,
(i >> 16) & 0xFF,
(i >> 8) & 0xFF,
i & 0xFF);
https://stackoverflow.com/questions/1680365
复制相似问题