Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IPAddress.TryParse返回不需要的结果_C#_.net_Vb.net - Fatal编程技术网

C# IPAddress.TryParse返回不需要的结果

C# IPAddress.TryParse返回不需要的结果,c#,.net,vb.net,C#,.net,Vb.net,我有一个函数,它返回给定ip地址是否有效或是否使用IPAddress类。我在测试它,它返回有效的(真),即使我通过“0123456”或“11111”或“9999”时没有一个点作为参数。我用VB.net和C#编写了它,结果是一样的 // C# public bool CheckIpAddress(string ipAddr) { IPAddress ip = null; return IPAddress.TryParse(ipAddr,out ip); } // VB.net

我有一个函数,它返回给定ip地址是否有效或是否使用IPAddress类。我在测试它,它返回有效的(真),即使我通过“0123456”或“11111”或“9999”时没有一个点作为参数。我用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)

这就是为什么
IPAddress.TryParse
返回
true

MSDN上甚至有这样的描述:

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

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


如果您想根据模式进行验证,则应该使用正则表达式。 此代码应有助于:

 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
公共函数CheckIpAddress(ipAddr作为字符串)作为布尔值
Dim parts()作为字符串=ipAddr.Split(新字符(){“.c},StringSplitOptions.RemoveEmptyEntries)
将rv设置为布尔值
如果是部分,那么长度为4
rv=假
其他的
将anIP设置为Net.IPAddress
如果是Net.IPAddress.TryParse(ipAddr,anIP),则
rv=真
其他的
rv=假
如果结束
如果结束
返回rv
端函数

我知道ip地址是如何复合的、正确的格式等等。11111不是有效的ip地址,1.1.1.1是有效的。那么你是说这个方法(tryParse)只检查每8位的部分?为什么999返回true?
11111
是一个有效的IP地址,因为它适合32位数字。IP地址中的点只是为了让人们更容易读取地址。但这并不意味着它们是必需的。来自wiki:IP地址是二进制数,但它们通常存储在文本文件中,并以人类可读的符号显示,例如172.16.254.1(对于IPv4)和2001:db8:0:1234:0:567:8:1(对于IPv6)。所以还有其他类可以检查可读的IP地址格式吗?我不知道。但是您应该能够自己非常轻松地编写这样的功能。
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