子网掩码“/”转换Cisco 0.0.0.0 标准的表示法
我已经搜索过寻求帮助,但找不到我的问题的答案。
情况:我需要将“/NN”子网掩码表示法(例如IPTABLES)转换为0.0.0.0 cisco 表示法。
NN 是子掩码中“1”的数量,从最低八位位组到较高八位位组。每个八位位组都是 8 位整数。
可能的解决方案:
制作一个包含 32 个“0”的数组,并用“1”填充最后 NN 个数字,然后分组为 4 个八位字节并转换为 int.../23 掩码应该类似于 0.0.1.255。
我的问题是如何在.NET 中做到这一点...我从未使用过二进制操作和转换。
你们能帮我解决这个问题吗?
更新 - 斯蒂芬的答案正确!
这是移植到.NET 的代码
if (p.LastIndexOf("/") < 0 ) return p;
int mask= Convert.ToInt32("0"+p.Substring(p.LastIndexOf("/")+1,2));
int zeroBits = 32 - mask; // the number of zero bits
uint result = uint.MaxValue; // all ones
// Shift "cidr" and subtract one to create "cidr" one bits;
// then move them left the number of zero bits.
result &= (uint)((((ulong)0x1 << mascara) - 1) << zeroBits);
result = ~result;
// Note that the result is in host order, so we'd have to convert
// like this before passing to an IPAddress constructor
result = (uint)IPAddress.HostToNetworkOrder((int)result);
string convertedMask = new IPAddress(result).ToString();
I've searched SO for help but could'nt find a answer to my question.
Situation: I need to convert a "/NN" subnet mask notation (think IPTABLES) to a 0.0.0.0 cisco notation.
NN are the number of "1" in the submask, from the lowest octet to the higher. Each octet are 8 bit integers.
Possible solution:
Make a array of 32 "0" and filling the last NN digits with "1", then group in 4 octets and converting to int... a /23 mask should be like 0.0.1.255.
My question is how to do it in .NET... i never used binary manipulation and conversion.
Can you guys help me with this solution?
UPDATE - Stephen has answer correctly!
Here is the code ported to .NET
if (p.LastIndexOf("/") < 0 ) return p;
int mask= Convert.ToInt32("0"+p.Substring(p.LastIndexOf("/")+1,2));
int zeroBits = 32 - mask; // the number of zero bits
uint result = uint.MaxValue; // all ones
// Shift "cidr" and subtract one to create "cidr" one bits;
// then move them left the number of zero bits.
result &= (uint)((((ulong)0x1 << mascara) - 1) << zeroBits);
result = ~result;
// Note that the result is in host order, so we'd have to convert
// like this before passing to an IPAddress constructor
result = (uint)IPAddress.HostToNetworkOrder((int)result);
string convertedMask = new IPAddress(result).ToString();
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我一直想组合一些通用的地址屏蔽例程...
这是一种从 CIDR 表示法:
I've been meaning to throw together some general-purpose address masking routines...
Here's a quick-and-dirty way to convert from CIDR notation to a subnet mask:
相同的?就像 VB .Net 中的 Stephens 一样
Same? as Stephens in VB .Net
我建议使用 IPNetwork 库 https://github.com/lduchosal/ipnetwork。
从版本 2 开始,它还支持 IPv4 和 IPv6。
IPv4
输出
玩得开心!
I would recommend the use of IPNetwork Library https://github.com/lduchosal/ipnetwork.
As of version 2, it supports IPv4 and IPv6 as well.
IPv4
Output
Have fun !