【问题标题】:In C#, I have a subnet bits and need to create a Subnet Mask. How might I do this?在 C# 中,我有一个子网位,需要创建一个子网掩码。我该怎么做?
【发布时间】:2012-10-24 15:20:07
【问题描述】:

我有一个任务要在 C# 中完成。我有一个子网名称:192.168.10.0/24

我需要找到子网掩码,在本例中为 255.255.255.0。

但是,我需要能够在 C# 中执行此操作,而无需使用 System.Net 库(我正在编程的系统无法访问此库)。

看起来这个过程应该是这样的:

1) 将子网名称拆分为数字和位。

2) 将我在 SO 上找到的 Bits 放入其中(感谢 Converting subnet mask "/" notation to Cisco 0.0.0.0 standard):

var cidr = 24; // e.g., "/24" 
var zeroBits = 32 - cidr; // the number of zero bits 
var 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 << cidr) - 1) << zeroBits); 

// 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); 

但是,我遇到的问题是我无法访问我正在工作的系统中包含 IPAddress.HostToNetworkOrder 命令的库。另外,我的 C# 很差。有谁有 C# 知识可以提供帮助吗?

【问题讨论】:

  • 代码现在是:uint bitsUInt = Convert.ToUInt32(bits); uint zeroBits = 32 - bitsUInt; uint result = uint.MaxValue; result &amp;= ((((ulong)0x1 &lt;&lt; bitsUInt) - 1) &lt;&lt; zeroBits);string maskString = result.ToString(); 遗憾的是,解释器说,“运算符'
  • C/C++ 在接近裸机时更加优雅。如果您有选择,那将是比 C# 更好的选择。我猜你在这里别无选择,很高兴看到你找到了答案,但如果考虑性能,那就找一个更好的。

标签: c# cisco subnet


【解决方案1】:

您可以使用以下方法替换该方法:

static void ToNetworkByteOrder(ref uint n) {
    if(BitConverter.IsLittleEndian) {
        // need to flip it
        n = (
            (n << 24)
            |
            ((n & 0xff00) << 8)
            |
            ((n & 0xff0000) >> 8)
            |
            (n >> 24)
        );
    }
}

【讨论】:

  • 嗯。我不得不重新输入代码,因为解释器似乎不喜欢 vars,所以我需要将所有内容都转换为 uint。我现在遇到的问题是它在结果上说 &= ((((ulong)0x1
  • 我看不出当前代码有什么问题。您使用的是 C# 2 吗? var 关键字应该在 VS 2008 或更新版本中可用。 cidrzeroBits 应该和 int 一样好,这将是它们使用 var 关键字的隐式类型。 result 也可以,因为它将是 uint。您只需将最后一行更改为:ToNetworkByteOrder(ref result);。如果您对此更满意,可以更改返回结果的方法,或者阅读 MSDN 上的refmsdn.microsoft.com/en-us/library/14akc2c7(v=VS.71).aspx
【解决方案2】:

这里有一个更简单的获取面具的方法:

int mask = -1 << (32 - cidr);

您不需要Net 程序集来以正确的顺序获取字节,您可以使用BitConverter 类:

if (BitConverter.IsLittleEndian) {
  byte[] parts = BitConverter.GetBytes(mask);
  Array.Reverse(parts);
  mask = BitConverter.ToInt32(parts, 0);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-19
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多