首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用c++将ipaddress/掩码转换为CIDR?

如何使用c++将ipaddress/掩码转换为CIDR?
EN

Stack Overflow用户
提问于 2013-12-13 17:46:29
回答 2查看 9.1K关注 0票数 4

我有一个ipaddress/掩码列表,需要转换为CIDR符号。

例如,需要将12.174.36.240/24转换为12.174.36.0/24或类似于http://www.subnet-calculator.com/cidr.php所做的事情

这怎么能做到呢?

PS:掩码值并不总是24。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-13 18:12:15

为了引导您朝着正确的方向前进,请考虑IPv4地址是什么(32位整数)。现在,考虑什么是掩码(在按位操作中使用的位字段)。

在大端系统上取地址127.0.0.1。用十六进制来说,那是0x7f000001。24位掩码是0xffffff00 ( 1位24位,0位8位,总共32位).按位的地址和掩码0x7f000001 & 0xffffff00 = 0x7f000000是CIDR格式。

我让您决定如何最好地解析地址,将IPv4地址转换为其整数形式(和back),并从路由前缀掩码创建一个位掩码,不过我将告诉您,至少有一些用于地址操作的标准函数。

票数 2
EN

Stack Overflow用户

发布于 2013-12-13 22:10:46

因此,IPV4 4地址和网络掩码基本上是32位无符号整数,它们之间有一个点,以对8位的形式显示。

因此,如果有"a.b.c.d“,则可以通过以下操作获得整数值

代码语言:javascript
运行
复制
(a<<24) + (b<<16) + (c<<8) + d 

如果您不习惯<<,它会将数字中的位移到左边,将次数作为正确的参数。因此,a<<ba*2^b相同

现在,在CIDR中,斜杠后面的数字告诉您斜杠之前的数字的网络部分是多少位(32位)。例如:10.10.10.1/28有28位网络,32-28=4位主机部分。这意味着,如果您接受ip并将其转换为一个数字(=0x0A0A0A01),并使用& (= 0xFFFFFFFF0)执行逻辑0xFFFFFFFF<<4,则会得到0x0A0A0A00。如果您使用以下内容将其转换回ip:

代码语言:javascript
运行
复制
sprintf("%d.%d.%d.%d", (n>>24)&0xff, (n>>16)&0xff, (n>>8)&0xff, n&0xff) 

你会得到10.10.0。同样,如果使用相同的算法将0xFFFFF0转换为ip,则会得到255.255.255.248,这是对应于掩码长度28的网络掩码。

IPv6是完全相同的,除了它在8 16位集群中划分的128位,在它们之间以十六进制显示,它们之间有逗号,对于0(::)的多次运行有一些奇特的快捷方式。

例如:

代码语言:javascript
运行
复制
fe80::52e5:49ff:ffc9:1889/64 == 

;;convert the mask 
0xffffffffffffffffffffffffffffffff << (128-64) =
0xffffffffffffffff0000000000000000

;;convert the ip:
fe80::52e5:49ff:ffc9:1889 ==
fe80:0000:0000:0000:52e5:49ff:ffc9:1889 ==
0xfe8000000000000052e549ffffc91889 

  0xfe8000000000000052e549ffffc91889
& 0xffffffffffffffff0000000000000000
= 0xfe800000000000000000000000000000

;;convert first address in range back to string:
fe80:0000:0000:0000:0000:0000:0000:0000 = 
fe80::

我想,在此基础上,你可以做一个你想做的函数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20572801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档