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
属性返回的值直接转换为网络字节顺序。
我们可以使用andArray.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