如何在C#中检查IP范围是否符合IPv4/IPv6 CIDR格式?
验证IPv4/IPv6 CIDR格式的实现方案
你提供的代码仅能验证单个IP地址的合法性,无法处理带子网前缀的CIDR格式(比如192.168.2.0/24)。以下是修改后的实现,专门用于验证CIDR格式的合法性:
public static bool IsValidCidr(string cidrAddress) { // 拆分CIDR地址为IP部分和前缀长度部分 string[] parts = cidrAddress.Split('/'); if (parts.Length != 2) return false; string ipPart = parts[0]; if (!IPAddress.TryParse(ipPart, out IPAddress ip)) return false; // 解析并验证前缀长度的合法性 if (!int.TryParse(parts[1], out int prefixLength)) return false; switch (ip.AddressFamily) { case AddressFamily.InterNetwork: // IPv4前缀长度范围为0-32 return prefixLength is >= 0 and <= 32; case AddressFamily.InterNetworkV6: // IPv6前缀长度范围为0-128 return prefixLength is >= 0 and <= 128; default: return false; } }
代码说明:
- 首先拆分输入字符串,确保格式为
[IP地址]/[前缀长度] - 调用
IPAddress.TryParse验证IP部分是否为合法的IPv4或IPv6地址 - 将前缀部分解析为整数,并根据IP类型判断是否在合法范围内:
- IPv4的前缀长度必须是0到32之间的整数
- IPv6的前缀长度必须是0到128之间的整数
如果需要同时兼容单个IP地址(不带前缀)的验证,可以使用以下版本:
public static bool IsValidIpOrCidr(string address) { string[] parts = address.Split('/'); if (parts.Length > 2) return false; string ipPart = parts[0]; if (!IPAddress.TryParse(ipPart, out IPAddress ip)) return false; // 无前缀时,直接判定为合法IP if (parts.Length == 1) return true; if (!int.TryParse(parts[1], out int prefixLength)) return false; switch (ip.AddressFamily) { case AddressFamily.InterNetwork: return prefixLength is >= 0 and <= 32; case AddressFamily.InterNetworkV6: return prefixLength is >= 0 and <= 128; default: return false; } }
内容的提问来源于stack exchange,提问作者Chaka
相关产品推荐
相关产品推荐

