如何在C++中将IP地址(包括ipv4和ipv6)转换为二进制文件?

问题描述:

我有一个字符串表示一个IP地址,它可以是ipv4和ipv6。如何在C++中将IP地址(包括ipv4和ipv6)转换为二进制文件?

我想要的是将其转换为小数形式,然后我可以获取单个位。

例如,由字符串“192.168.0.1”为代表的地址我想获得一个十进制3232235521.

最好的办法是使用一些标准库,比如函数inet_pton会做很大的。但我不知道如何使用它。

我写了一个基于信息有关SOCKADDR_IN here下面的代码:

struct sockaddr_in sa; 
    char str[INET_ADDRSTRLEN]; 
    // store this IP address in sa: 
    inet_pton(AF_INET, "192.168.0.1", &(sa.sin_addr)); 
    cout<<"bin by inet_pton"<<sa.sin_addr.s_addr<<endl; 

这给了我553779392.这个数字相当于1.0.168.192。当然,我可以编写一些函数来反转这个数字,但我正在寻找一些将IP地址转换为二进制的标准和有效方法。

+1

你的例子中的问题是字节顺序。您的主机正在将ip地址存储为little-endian。如果你想让你的代码按照你写的方式工作,可以使用htonl(sa.sin_addr.s_addr)来表示它为big-endian。 – 2to1mux 2013-03-20 18:35:35

我猛地这个代码Beej的指南网络编程:

struct sockaddr_in antelope; 
char *some_addr; 

inet_aton("10.0.0.1", &antelope.sin_addr); // store IP in antelope 

some_addr = inet_ntoa(antelope.sin_addr); // return the IP 
printf("%s\n", some_addr); // prints "10.0.0.1" 

// and this call is the same as the inet_aton() call, above: 
antelope.sin_addr.s_addr = inet_addr("10.0.0.1"); 

我们在这里是移动IP地址来回它通常用于存储地址信息结构类型之间的一个例子和一个字符串。这段代码的最后一行基本上就是你需要的。 ip地址的整数表示存储在antelope.sin_addr.s_addr中。 s_addr只是一个无符号长整型,所以它应该正是你所需要的。如果你做到这一点:

cout << antelope.sin_addr.s_addr << endl; 

,你会得到10.0.0.1

编辑的十进制表示:我加了注释下你原来的代码,你已经有代码来表达问题,这基本上只是排序问题。我在这个答案中给你的代码可能会给你同样的问题。你需要使用htonl()来颠倒字节顺序。

+0

不幸的是,你的代码和我上面发布的代码一样 - 对于10.0.0.1它给我16777226,这对应于1.0.0.10。另外,inet_addr不支持ipv6(inet_pton)。 – Ievgen 2013-03-20 18:52:58

+0

我刚刚注意到你的评论,是htonl()完美的作品,非常感谢! – Ievgen 2013-03-20 18:55:13

+1

@ 2to1mux - 我加粗了保存我背后的文字。在第一,第二和第三眼看你的字符串结构和结构字符串不帮助我。最后!!!我更深入地阅读并发现了将IP地址从字符串获取到文本中隐藏的整数(对我而言)的答案。这是一个很好的答案。 upvoted它为你,哥们。非常感谢。 :-) – Patricia 2014-04-23 00:09:30

为了获取IP地址的INTEGER表示:

我们需要密切关注在@ 2to1mux的帖子下面的信息。

该IP地址的整数表示被存储在antelope.sin_addr.s_addr中。

s_addr只是一个unsigned long

例子:

struct sockaddr_in antelope; 

// Here I had to convert from NSString to c string 
inet_pton(AF_INET, [ipAddress UTF8String], &(antelope.sin_addr)); 

// This line gets the integer value 
UInt32 address = antelope.sin_addr.s_addr; 

我希望这额外的后使得晶莹剔透的困惑,像我一样。