【问题标题】:How to convert CIDR subnet mask to HEX format?如何将 CIDR 子网掩码转换为 HEX 格式?
【发布时间】:2019-08-21 18:40:30
【问题描述】:

告诉我如何得到一个等于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");

【问题讨论】:

  • 更多与您的问题相关(我猜):您认为IPAddress.HostToNetworkOrder 会做什么?
  • @elgonzo 然后我得到一个带有两个零的值FFFFFE00
  • 是的,这就是将低 9 位设置为零时得到的结果(因为您这样做了zeroBits = 32 - cidrcidr 为 23)。如果你不希望低 9 位为零,那么不要将低 9 位归零,我猜。查看FFFFFFFE 的位表示(您想要的子网掩码)。那么右边会有多少个零位,那么zeroBits 变量的值应该是多少呢?然后再看看子网掩码中有多少个 1(一)位,那么cidr 的值应该是多少?
  • "FFFFFFFE = mask 255.255.254.0 = mask sidr /23" 不。那不是真的。好吧,“mask 255.255.254.0 = cidr /23”是真的,但是“FFFFFFFE = mask 255.255.254.0”根本不是真的。您是如何最终相信子网掩码 255.255.254.0 的十六进制值/表示会是 FFFFFFFE?
  • 是的,FFFFFE00 正是您为 /23 CIDR 获得的结果值... ;-)

标签: c# .net winforms hex netmask


【解决方案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

【讨论】:

  • 谢谢!您的字符串转换器对(bits.Data.ToString("X2") 有很大帮助,但不明白为什么是“X2”。感谢您花时间写了很多选项!
  • Xx =&gt; 转换为大写或小写的十六进制字符串:15.ToString("X") =&gt; F15.ToString("x") =&gt; fX2x2 => 所有值都用 2 个符号表示:15.ToString("X2") =&gt; 0F 而不仅仅是 F
  • 在您的帮助下,现在可以制作小写字母i.stack.imgur.com/86H3t.png
猜你喜欢
  • 2016-05-06
  • 1970-01-01
  • 2016-02-18
  • 2021-06-02
  • 2021-05-14
  • 2020-12-22
  • 2016-10-31
  • 2017-10-29
  • 1970-01-01
相关资源
最近更新 更多