IPAddress.TryParse返回不需要的结果

我有一个函数,如果给定的IP地址有效或不使用IPAddress类返回。 我正在测试它并返回有效(true),即使我传递“0123456”或“11111”或“99999”而没有点作为参数。 我在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:0:567: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 

如果要对模式进行validation,则应使用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