我正在尝试在C#/ .NET 2.0中完成以下操作: 给定一个IPAddress对象(例如,192.168.127.100)和另一个包含IPv4Mask /子网掩码(例如,255.255.248.0)的IPAddress对象,我应该能够计算IP地址范围的开始和结束
给定一个IPAddress对象(例如,192.168.127.100)和另一个包含IPv4Mask /子网掩码(例如,255.255.248.0)的IPAddress对象,我应该能够计算IP地址范围的开始和结束.
(是的,我正在尝试通过子网上的一系列地址进行for循环.)
从理论上讲,我应该能够在IPAddress和SubnetMask上按位AND来获取IPStart.然后我应该能够在IPStart和反转(NOT’d)SubnetMask上执行按位异或,以获得IPEnd.
IPAddress对象提供了将地址输出为“long”或“byte []”(字节数组)的方法.
对long执行按位运算(因为它已签名?)会产生无效结果.而且我似乎无法对IP地址执行按字节操作作为字节数组.
EDIT-1:好的,循环遍历数组中的每个字节并执行按位AND,NOT和XOR(在每种情况下)得到正确的结果.
我遇到的下一个问题是,在将byte []数组转换为UInt32或long之后,我无法轻松执行for循环.因此,第一个值正常工作,但是将uint / long递增1使得IPaddress从192.168.127.0增加到193.168.127.0 – 似乎在byte []数组转换为uint / long后,顺序为字节反转.因此,没有简单的方法可以从IPStart增加到IPEnd.
有什么建议吗?
将两个byte []数组一起爬行,对于每个位对执行按位比较,并将结果放入范围start的第三个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