C++怎么把long类型数据转换成IP地址格式?windows环境。要有具体代码。

2025-04-27 13:22:34
推荐回答(4个)
回答1:

主要思路就是位运算,左移和右移。先介绍下:

左移运算:x << y。将x左移y位,将x最左边的y位丢弃,在右边补y个0。

右移运算:x >> y。将x右移y位,这需要区分x是有符号数还是无符号数。在x是无符号数时,只需将x的最右边的y位丢弃,在左边补上y个0。在x是有符号数时,又分为x是正数还是负数。正数时,同无符号数的处理相同;负数时,将将x的最右边的y位丢弃,在左边补上y个1。(http://blog.csdn.net/zouliping123/article/details/8995373)

具体实现效果如下图:


#include 
#include 

int main()

{
unsigned long ipAddres = 0xffeeddcc; //ip是4段,每段都是0~255的范围,就是每段是1个byte,总共4个byte,long的大小是4byte,但是要用无符号的
unsigned char ip[4];//可以用4个unsigned char来保存IP,数据范围0~255
for (int i = 0;i < 4;++i)
{
unsigned long temp = ipAddres << (2 * i) * 4; //每次先把需要ip数据移到最左边
temp = temp >> 6 * 4; //然后把最左边的两位移到最低位
ip[i] = (unsigned char )temp ; //强制转换成unsigned char保存
}
return 0;

}

0xffeeddcc中,要把ee移到ff的位置上要向左边移动1个byte,8个bit。如i=1时,上面循环中temp = ipAddres << (2 * i) * 4
,即往左移动1个byte,temp=0xeeddcc00; temp =temp >> 6 * 4 即每次右移3个byte,temp=0x000000ee; 最后ip[1]=0xee;

回答2:

用API可以,但有更简单的办法:
#include "stdio.h"
char IP[32]; // 存放IP串
long ip1; // 原long型IP地址
unsigned char *p=(unsigned char *)&ip1;
sprintf(IP,"%d.%d.%d.%d",(int)p[0],(int)p[1],(int)p[2],(int)p[3]);
// IP

回答3:

使用inet_ntoa函数即可

#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
struct in_addr addr1,addr2;
ulong l1,l2;
l1= inet_addr("192.168.0.74");
l2 = inet_addr("211.100.21.179");
memcpy(&addr1, &l1, 4);
memcpy(&addr2, &l2, 4);
printf("%s : %s\n", inet_ntoa(addr1), inet_ntoa(addr2)); //注意这一句的运行结果
printf("%s\n", inet_ntoa(addr1));
printf("%s\n", inet_ntoa(addr2));
return 0;
}
实际运行结果如下:
192.168.0.74 : 192.168.0.74 //从这里可以看出,printf里的inet_ntoa只运行了一次。
192.168.0.74
211.100.21.179
inet_ntoa返回一个char *,而这个char *的空间是在inet_ntoa里面静态分配的,所以inet_ntoa后面的调用会覆盖上一次的调用。第一句printf的结果只能说明在printf里面的可变参数的求值是从右到左的,仅此而已。  

回答4:

long l = value;
struct in_addr addr;
addr.S_addr = l;
char *s = inet_ntoa(addr);