C# 如何将CIDR子网掩码转换为十六进制格式?

C# 如何将CIDR子网掩码转换为十六进制格式?,c#,.net,winforms,hex,netmask,C#,.net,Winforms,Hex,Netmask,告诉我如何获得一个等于fffffff e的值,结果是只按相反顺序输出efff,并且没有FF的前两个字符 源代码: var-cidr=23; var零位=32-cidr; var结果=uint.MaxValue; 结果&=(uint)((ulong)0x1一个可能的解决方案,使用类从网络掩码的位长度创建位数组 如果您只想打印十六进制表示,则由BitVector32返回的位掩码就足够了。 假设您还希望以IPV4格式表示地址。在这种情况下,网络掩码当然是反转的。要将其转换为有效的IpAddress,我

告诉我如何获得一个等于
fffffff e
的值,结果是只按相反顺序输出
efff
,并且没有
FF
的前两个字符

源代码:

var-cidr=23;
var零位=32-cidr;
var结果=uint.MaxValue;

结果&=(uint)((ulong)0x1一个可能的解决方案,使用类从网络掩码的位长度创建位数组

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

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

这就是所需要的:

int cidr = 23;
var bits = new BitVector32(-1 << (32 - cidr));
要将其转换为
IpAddress
格式(如果需要):

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

Console.WriteLine(netMask); 
=> 255.255.254.0

与您的问题更相关(我猜):您认为
IPAddress.HostToNetworkOrder
有什么作用?@elgonzo然后我得到一个带有两个零的值
fffff e00
是的,这是您将低9位设置为零时得到的结果(因为您是
zeroBits=32-cidr
,cidr为23)。如果您不希望低9位为零,那么我想就不要将低9位置零。请查看
fffffff e
(您所需的子网掩码)的位表示形式。右侧将有多少个零位,因此,
zeroBits
变量的值应该是多少?然后再查看有多少个1(一)子网掩码中的位,因此,
cidr
的值应该是多少?“fffffff e=mask 255.255.254.0=mask sidr/23”不。这不是真的。是真的,“mask 255.255.254.0=cidr/23”,但“fffff e=mask 255.255.254.0”一点也不正确。你怎么会相信子网掩码255.255.254.0的十六进制值/表示形式是FFFFFFF E?是的,FFFFF E00正是你得到的/23 CIDR的结果值…;-)谢谢!你的字符串转换器帮了大忙
(bits.Data.ToString(“X2”)
,但我不明白为什么是“X2”。感谢您花时间编写了大量选项!
X
X=>
转换为大写或小写的十六进制字符串:
15.ToString(“X”)=>F
15.ToString(“X”)=>F
X2
X2
=>所有值都用两个符号表示:
15.ToString(“X2”)=>0F
而不仅仅是
F
。在您的帮助下,现在可以制作小写字母
Console.WriteLine(bits.Data.ToString("X2"));
=> FFFFFE00
var bytes = BitConverter.GetBytes((uint)bits.Data);
var netMask = new IPAddress(bytes.Reverse().ToArray());

Console.WriteLine(netMask); 
=> 255.255.254.0