
C++怎么把long类型数据转换成IP地址格式?windows环境。要有具体代码。
4个回答
展开全部
主要思路就是位运算,左移和右移。先介绍下:
左移运算: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 <iostream>
#include <string>
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;
展开全部
用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
#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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
使用inet_ntoa函数即可
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
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里面的可变参数的求值是从右到左的,仅此而已。
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
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里面的可变参数的求值是从右到左的,仅此而已。
参考资料: http://baike.baidu.com/view/569200.htm
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
long l = value;
struct in_addr addr;
addr.S_addr = l;
char *s = inet_ntoa(addr);
struct in_addr addr;
addr.S_addr = l;
char *s = inet_ntoa(addr);
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询