gpt4 book ai didi

c# - IP 地址验证

转载 作者:可可西里 更新时间:2023-11-01 07:49:15 27 4
gpt4 key购买 nike

我正在重构我的代码并想使用 IPAddress.TryParse验证字符串是否为有效 IPv4 地址的方法,而不是使用正则表达式:

public static bool IsIPv4(string value)
{
IPAddress address;

if (IPAddress.TryParse(value, out address))
{
if (address.AddressFamily == AddressFamily.InterNetwork)
{
return true;
}
}

return false;
}

我的单元测试现在失败了,因为这些输入值返回 true 并被解析为以下 IPAddress 对象:

value = "0.0.0.0"      ->  address = {0.0.0.0}
value = "255.255.255" -> address = {255.255.0.255}
value = "65536" -> address = {0.1.0.0}

这有意义吗?我可以看到 0.0.0.0从技术上讲是一个有效的 IPv4 地址,即使用户输入该地址毫无意义。另外两个呢?为什么它们以它们现在的方式转换,我是否应该将它们视为有效,即使它对用户可能不透明,用户可能只是忘记输入句点(65536 而不是 6.5 .5.36).

非常感谢任何帮助。

最佳答案

IPAddress.TryParse() 的工作不是检查字符串是否 是一个有效的 IP 地址,而是检查字符串的内容是否可以解析 (即;转换)为有效的 IP 地址。

您的测试用例中的所有选项实际上都可以解析为表示和 IP。归结为您的测试用例是有效的。问题是您的测试用例的数据无效,或者您没有在测试用例中使用正确的工具来获得预期的结果。

如果您专门测试一个有效的 IPv4,恰好有 4 个四边形(每个都是 0 - 255 之间的整数),并且想要避免使用正则表达式,您可以改为拆分然后解析和验证。

public static bool IsIPv4(string value)
{
var octets = value.Split('.');

// if we do not have 4 octets, return false
if (octets.Length!=4) return false;

// for each octet
foreach(var octet in octets)
{
int q;
// if parse fails
// or length of parsed int != length of octet string (i.e.; '1' vs '001')
// or parsed int < 0
// or parsed int > 255
// return false
if (!Int32.TryParse(octet, out q)
|| !q.ToString().Length.Equals(octet.Length)
|| q < 0
|| q > 255) { return false; }

}

return true;
}

关于c# - IP 地址验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5096780/

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