IPAddress.TryParse的入侵行为

本文关键字:入侵 TryParse IPAddress | 更新日期: 2023-09-27 17:51:16

我使用IPAddress.TryParse来验证IP地址,但如果我使用

if (IPAddress.TryParse("192.168.1.009", out ip)

它失败了,但是

if (IPAddress.TryParse("192.168.1.007", out ip)

通过。基本上,如果最后一个数字是8或9,则在有效的IP地址上失败。

我不知道该怎么做才能让它发挥作用?

IPAddress.TryParse的入侵行为

快速猜测:

009007被解释为八进制数,而007是以8为基的有效数,009不是。

请改用if (IPAddress.TryParse("192.168.1.9", out ip))

您的最后一个部分以0开头,以零开头的四进制必须视为基数8(八进制(,因此,例如,任何以零开头并包含数字8或9的四进制部分都是无效的。如果你尝试"192.168.018.110"..这也会失败。。请参阅我下面的评论,您对有疑问

您可以使用正则表达式更改格式:

IPAddress ip;
string ipString = "192.168.1.009";
string goodIpString = Regex.Replace(ipString, @"[0]+('d+)", "$1");
var res = IPAddress.TryParse(goodIpString, out ip); // true

以下是两种验证IPv4地址字符串并将其解析为类型为IPAddress:的对象的解决方案

1.(

如果您喜欢正则表达式,则只需一行代码就可以清除TryParse()之前的前导零。

string ipString = "192.168.1.009"; // any input
// strip leading zeros from IP address, because otherwise the digits 
// are interpreted as octal numbers with a wrong result or parser error!
// usage example: "192.108.064.008" --> "192.108.64.8"
string cleanedAddressStr = Regex.Replace(ipString, @"'b0+('d+)", "$1");
if (IPAddress.TryParse(goodIpString, out IPAddress ipAddress))
{
    // do something with variable ipAddress
}
else
{
    // report error in address string
}

旁注:'b单词边界的符号。在上面的正则表达式中,它匹配字符串开头和句点。

2.(

如果您喜欢不带regex的解决方案,则可以使用此解决方案。

string ipString = "192.168.1.009"; // any input
IPAddress ipAddress = IPAddress.None;
try
{
    string[] splittedString = ipString.Split('.');
    byte[] byteArray = new byte[4];
    byteArray[0] = (byte)int.Parse(splittedString[0]);
    byteArray[1] = (byte)int.Parse(splittedString[1]);
    byteArray[2] = (byte)int.Parse(splittedString[2]);
    byteArray[3] = (byte)int.Parse(splittedString[3]);
    ipAddress = new IPAddress(byteArray);
}
catch (Exception e)
{
    // report error in address string
}
if (ipAddress != IPAddress.None)
{
    // do something with variable ipAddress
}