我有一个方法来验证参数IP地址.作为一个整体发展的新手,我想知道是否有更好的方法来做到这一点.
/// <summary>
/// Check IP Address, will accept 0.0.0.0 as a valid IP
/// </summary>
/// <param name="strIP"></param>
/// <returns></returns>
public Boolean CheckIPValid(String strIP)
{
// Split string by ".", check that array length is 3
char chrFullStop = '.';
string[] arrOctets = strIP.Split(chrFullStop);
if (arrOctets.Length != 4)
{
return false;
}
// Check each substring checking that the int value is less than 255 and that is char[] length is !> 2
Int16 MAXVALUE = 255;
Int32 temp; // Parse returns Int32
foreach (String strOctet in arrOctets)
{
if (strOctet.Length > 3)
{
return false;
}
temp = int.Parse(strOctet);
if (temp > MAXVALUE)
{
return false;
}
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
它很简单(我可以做到),但它似乎做了伎俩.
Hab*_*bib 83
所述限制用IPAddress.TryParse方法是,它验证是否字符串可能被转换成IP地址,因此,如果它与一个字符串值等供给"5",它认为它是"0.0.0.5".
另一种验证IPv4的方法可能如下:
public bool ValidateIPv4(string ipString)
{
if (String.IsNullOrWhiteSpace(ipString))
{
return false;
}
string[] splitValues = ipString.Split('.');
if (splitValues.Length != 4)
{
return false;
}
byte tempForParsing;
return splitValues.All(r => byte.TryParse(r, out tempForParsing));
}
Run Code Online (Sandbox Code Playgroud)
它可以测试如下:
List<string> ipAddresses = new List<string>
{
"2",
"1.2.3",
"1.2.3.4",
"255.256.267.300",
"127.0.0.1",
};
foreach (var ip in ipAddresses)
{
Console.WriteLine($"{ip} ==> {ValidateIPv4(ip)}");
}
Run Code Online (Sandbox Code Playgroud)
输出将是:
2 ==> False
1.2.3 ==> False
1.2.3.4 ==> True
255.256.267.300 ==> False
127.0.0.1 ==> True
Run Code Online (Sandbox Code Playgroud)
您也可以使用,IPAddress.TryParse但它有局限性,可能导致解析不正确.
System.Net.IPAddress.TryParse方法
请注意,如果TryParse成功解析输入,则返回true,但这并不一定意味着生成的IP地址是有效的IP地址.请勿使用此方法验证IP地址.
但这适用于包含至少三个点的普通字符串.就像是:
string addrString = "192.168.0.1";
IPAddress address;
if (IPAddress.TryParse(addrString, out address)) {
//Valid IP, with address containing the IP
} else {
//Invalid IP
}
Run Code Online (Sandbox Code Playgroud)
随着IPAddress.TryParse您可以检查三个点的存在,然后调用TryParse,如:
public static bool ValidateIPv4(string ipString)
{
if (ipString.Count(c => c == '.') != 3) return false;
IPAddress address;
return IPAddress.TryParse(ipString, out address);
}
Run Code Online (Sandbox Code Playgroud)
M A*_*ifi 13
using System.Net;
public static bool CheckIPValid(string strIP)
{
IPAddress result = null;
return
!String.IsNullOrEmpty(strIP) &&
IPAddress.TryParse(strIP, out result);
}
Run Code Online (Sandbox Code Playgroud)
你完成了
编辑1
添加了一些额外的检查以防止抛出异常(这是很昂贵的).PS它不会处理unicode.
编辑2
如果@StephenMurby 成功解析了字符串,IPAddress.TryParse它将返回true.如果您检查方法的文档,虽然它会在两种情况下抛出异常.
由您决定(设计决策)是否要抛出异常或返回false.在解析时,我通常更喜欢返回false而不是异常(假设这是输入不保证是正确的).
我说,打破退货声明,
记住C#布尔表达式是惰性求值的,因此如果字符串为null空或者为空,CLR将不会尝试解析该字符串.
关于失踪的if,你可以做点什么,
if (IP.TryParse(strIP, out result)
{
return true;
}
Run Code Online (Sandbox Code Playgroud)
但你真正在做的就是说如果事情是真的,那就回归真实.更容易直接返回表达式.
GGO*_*GGO 12
最好的正则表达式解决方案(对 MVC DataAnnotations 有用):
^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
Run Code Online (Sandbox Code Playgroud)
C#
Regex.IsMatch(value, "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$")
Run Code Online (Sandbox Code Playgroud)
为什么不使用IPAddress.Parse或IPAddress.TryParse
IPAddress.Parse(stringVarialbeContainingIP)
Run Code Online (Sandbox Code Playgroud)
不使用IPAddress类并针对字节进行验证,这比Int <256方法要好得多。
public Boolean CheckIPValid(String strIP)
{
// Split string by ".", check that array length is 4
string[] arrOctets = strIP.Split('.');
if (arrOctets.Length != 4)
return false;
//Check each substring checking that parses to byte
byte obyte = 0;
foreach (string strOctet in arrOctets)
if (!byte.TryParse(strOctet, out obyte))
return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)