我试图在 C#/.NET 2.0 中完成以下任务:
给定一个 IPAddress 对象(例如 192.168.127.100)和另一个包含 IPv4Mask/子网掩码的 IPAddress 对象(例如 255.255.248.0),我应该能够计算 IP 地址范围的开始和结束。
(是的,我正在尝试通过子网上的一系列地址进行 for 循环。)
理论上,我应该能够对 IPAddress 和 SubnetMask 进行按位与运算以获得 IPStart。然后我应该能够对 IPStart 和反转(非)子网掩码执行按位异或,以获得 IPEnd。
IPAddress 对象提供了将地址输出为“long”或“byte[]”(字节数组)的方法。
对 long 执行按位运算(因为它是有符号的?)会产生无效结果。我似乎无法对 IPAddresses 作为字节数组执行按位运算。
EDIT-1:好的,循环遍历数组中的每个字节并执行按位 AND、NOT 和 XOR(在每种情况下)都会得到正确的结果。
我遇到的下一个问题是,在将 byte[] 数组转换为 UInt32 或 long 后,我无法轻松执行 for 循环。因此,第一个值可以正常工作,但是将 uint/long 加一会使 IP 地址从 192.168.127.0 增加到 193.168.127.0 -- 看来在 byte[] 数组转换为 uint/long 后,字节被反转。因此,没有简单的方法可以从 IPStart 递增到 IPEnd。
大家有什么建议吗?
一起抓取两个 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)