如何将CIDR子网掩码转换为HEX格式?

时间:2019-03-31 12:24:18

标签: c# .net winforms hex netmask

告诉我如何获取等于FFFFFFFE的值,结果发现它仅以相反的顺序输出EFFFF,并且没有FF的前两个字符

源代码:Converting subnet mask “/” notation to Cisco 0.0.0.0 standard

var cidr = 23;
var zeroBits = 32 - cidr;
var result = uint.MaxValue;

result &= (uint)((((ulong)0x1 << cidr) - 1) << zeroBits);
result = (uint)IPAddress.HostToNetworkOrder((int)result);

textBoxHex.Text = result.ToString("X");

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案,使用BitVector32类根据网络掩码的位长度创建位数组。

如果只想打印十六进制表示,则BitVector32返回的位掩码就足够了。
假设您还想用IPV4格式表示地址。在这种情况下,网罩当然是倒置的。要将其转换为有效的IpAddress,我们需要反转字节顺序。

IPAddress.HostToNetworkOrder不会直接将BitVector32.Data属性返回的值转换为网络字节顺序。
我们可以使用BitConverter.GetBytesArray.Reverse()或LINQ的.Reverse()方法来做同样的事情。

这就是所需要的:

int cidr = 23;
var bits = new BitVector32(-1 << (32 - cidr));

要返回位掩码的十六进制表示,只需将其转换为指定十六进制格式的字符串即可:
Formatting Types in .NET (MSDN)

Console.WriteLine(bits.Data.ToString("X2"));
=> FFFFFE00

根据需要将其转换为IpAddress格式:

var bytes = BitConverter.GetBytes((uint)bits.Data);
var netMask = new IPAddress(bytes.Reverse().ToArray());

Console.WriteLine(netMask); 
=> 255.255.254.0