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地址上失败。
我不知道该怎么做才能让它发挥作用?
快速猜测:
009
和007
被解释为八进制数,而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
}