【发布时间】: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 &= ((((ulong)0x1 << bitsUInt) - 1) << zeroBits);string maskString = result.ToString();遗憾的是,解释器说,“运算符' -
C/C++ 在接近裸机时更加优雅。如果您有选择,那将是比 C# 更好的选择。我猜你在这里别无选择,很高兴看到你找到了答案,但如果考虑性能,那就找一个更好的。