gpt4 book ai didi

c# - 如何使用IPAddress和IPv4Mask获取IP地址范围?

转载 作者:行者123 更新时间:2023-11-30 14:20:41 27 4
gpt4 key购买 nike

我正在尝试在 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 执行按位运算(因为它是有符号的?)会产生无效结果。而且我似乎无法对作为字节数组的 IP 地址执行按位运算。

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

我遇到的下一个问题是,在将 byte[] 数组转换为 UInt32 或 long 后,我无法轻松执行 for 循环。因此,第一个值正常工作,但是将 uint/long 递增一个会使 IPaddress 从 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

关于c# - 如何使用IPAddress和IPv4Mask获取IP地址范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/996848/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com