我有一个函数,它返回给定的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