IP地址.TryParse返回不希望的结果



我有一个函数,它返回给定的ip地址是否有效或是否使用IPAddress类。我正在测试它,即使我在没有点作为参数的情况下通过"0123456"、"11111"或"99999",它也会返回有效(true)。我用VB.net和C#编写了它,得到了同样的结果。

// C#
public bool CheckIpAddress(string ipAddr)
{
    IPAddress ip = null;
    return IPAddress.TryParse(ipAddr,out ip);
}
  // VB.net
  Public Function CheckIpAddress(ipAddr As String) As Boolean
        Dim ip As IPAddress = Nothing
        Return Net.IPAddress.TryParse(ipAddr, ip)
    End Function

有人能解释一下为什么会发生这种事吗。我已经通过互联网将我的代码与一些来源进行了匹配,并且很好。

IP地址只有32位,因此11111绝对是一个正确的IP地址。IP地址中的点只是为了让人类更容易阅读它们。它们不是必需的。

IP地址是二进制数,但它们通常存储在文本文件中,并以人类可读的符号显示,如172.16.254.1(适用于IPv4)和2001:db8:0:1234:0567:8:1(适用于IPv6)。

来自IP地址-维基百科

这就是IPAddress.TryParse返回true的原因。

它甚至在MSDN上有描述:IPAddress.Parse方法

ipString中的部分数(每个部分用句点分隔)决定了IP地址的构造方式一部分地址直接存储在网络地址中。一个由两部分组成的地址,便于指定A类地址,它将前导部分放在网络地址的第一个字节中,尾部放在最右边的三个字节中。三部分地址,便于指定B类地址,将第一部分放在网络地址的第一个字节,将第二部分放在第二个字节,最后一部分放在最右边的两个字节。

还有一个例子(见第一个):

1 -- "65536"       0.0.255.255
2 -- "20.2"        20.0.0.2
2 -- "20.65535"    20.0.255.255
3 -- "128.1.2"     128.1.0.2

如果您想根据模式进行验证,您应该使用RegEx。这个代码应该有帮助:

 Match match = Regex.Match(input, @"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$");
 if (match.Success)
 {
     Console.WriteLine("It is a valid IP Address");
 }

因为这有一个vb.net标签

Public Function CheckIpAddress(ipAddr As String) As Boolean
    Dim parts() As String = ipAddr.Split(New Char() {"."c}, StringSplitOptions.RemoveEmptyEntries)
    Dim rv As Boolean
    If parts.Length <> 4 Then
        rv = False
    Else
        Dim anIP As Net.IPAddress
        If Net.IPAddress.TryParse(ipAddr, anIP) Then
            rv = True
        Else
            rv = False
        End If
    End If
    Return rv
End Function

相关内容

最新更新