3

我正在尝试在 C#/.NET 2.0 中完成以下任务:

给定一个 IPAddress 对象(例如 192.168.127.100)和另一个包含 IPv4Mask / 子网掩码的 IPAddress 对象(例如 255.255.248.0),我应该能够计算 IP 地址范围的开始和结束。

(是的,我正在尝试通过子网上的一系列地址进行 for 循环。)

从理论上讲,我应该能够对 IPAddress 和 SubnetMask 进行按位与来获取 IPStart。然后我应该能够对 IPStart 和倒置的 (NOT'd) SubnetMask 执行按位异或,以获得 IPEnd。

IPAddress 对象提供将地址输出为“long”或“byte[]”(字节数组)的方法。

对 long 执行按位运算(因为它是有符号的?)会产生无效的结果。而且我似乎无法对 IPAddresses 作为字节数组执行按位运算。

EDIT-1:好的,遍历数组中的每个字节并执行按位与、非和异或(在每种情况下)都会得到正确的结果。

我遇到的下一个问题是,在将 byte[] 数组转换为 UInt32 或 long 后,我无法轻松执行 for 循环。所以,第一个值可以正常工作,但是将 uint/long 加一会使 IP 地址从 192.168.127.0 增加到 193.168.127.0 -- 似乎在 byte[] 数组转换为 uint/long 之后,字节被反转。所以没有简单的方法可以从 IPStart 递增到 IPEnd。

有什么建议吗?

4

4 回答 4

3

一起爬取两个 byte[] 数组,对每个位对执行按位比较,并将结果放入第三个 byte[] 数组作为范围开始。您可以爬取网络地址 byte[] 数组并反转每个位以生成通配符掩码(如您所说,反转子网掩码),然后像以前一样使用通配符掩码代替子网掩码重复该过程以计算范围结束。还要记住,范围中的第一个值是子网网络地址,最后一个值是广播地址,因此这两个地址不在实际的主机地址范围内。这是您在分步摘要中的示例:

Address:   192.168.127.100       11000000.10101000.01111 111.01100100
Netmask:   255.255.248.0 = 21    11111111.11111111.11111 000.00000000
Wildcard:  0.0.7.255             00000000.00000000.00000 111.11111111
=>
Network:   192.168.120.0/21      11000000.10101000.01111 000.00000000
Broadcast: 192.168.127.255       11000000.10101000.01111 111.11111111
HostMin:   192.168.120.1         11000000.10101000.01111 000.00000001
HostMax:   192.168.127.254       11000000.10101000.01111 111.11111110
于 2009-06-15T16:05:24.447 回答
2

您可以使用BitConverter将这些数组转换为 uint。

试试这个:

uint address = BitConverter.ToUInt32(IPAddress.Parse("192.168.127.100").GetAddressBytes(), 0);
uint mask = BitConverter.ToUInt32(IPAddress.Parse("255.255.248.0").GetAddressBytes(), 0);
于 2009-06-15T15:55:55.247 回答
1

你走在正确的道路上。只需分别处理数组中的每个字节。

于 2009-06-15T15:51:37.297 回答
1

http://ipnetwork.codeplex.com/

示例代码:

var network = IPNetwork.Parse("192.168.1.0/29");
var addresses = IPNetwork.ListIPAddress(network);

foreach (var ip in addresses) {
    Console.WriteLine("{0}", ip);
}
于 2011-03-16T04:36:15.867 回答