使用IPAddress.TryParse()方法校验IP地址时不得不知的“坑”
2017-01-05 16:54
253 查看
使用IPAddress类的静态方法TryParse可以校验IP地址。具体用法如下所示。
执行上面的代码,会得到“0.0.0.8”的输出。
但是实际使用中,往往这不是我们想要的。使用该方法校验用户输入的ip地址就不太合理。一般来说,ip地址格式应该是”xxx.xxx.xxx.xxx”,而使用IPAddress类的静态方法TryParse校验ip地址时,随意输入一个整形字符串,也校验通过了。简直让人一脸懵逼。对于这种需求下,可以使用正则表达式来校验ip地址。下面是完整代码。
那么类IPAddress的静态方法TryParse的判断逻辑是怎样的呢?
TryParse方法先判断字符串是否能转换成uint类型数据,不能则返回false,转换成功则将uint数据转换成32位二进制数据,每八位二进制数据转换成十进制数,便转换成了最终的ip地址。像例子中的8转换成32位二进制数据为00000000000000000000000000001000,转换成ip地址为0.0.0.8。
看来以后校验ip地址还是老老实实使用正则吧。
IPAddress ip; IPAddress.TryParse("8", out ip); Console.WriteLine(ip);
执行上面的代码,会得到“0.0.0.8”的输出。
但是实际使用中,往往这不是我们想要的。使用该方法校验用户输入的ip地址就不太合理。一般来说,ip地址格式应该是”xxx.xxx.xxx.xxx”,而使用IPAddress类的静态方法TryParse校验ip地址时,随意输入一个整形字符串,也校验通过了。简直让人一脸懵逼。对于这种需求下,可以使用正则表达式来校验ip地址。下面是完整代码。
public static bool IPCheck(string IP) { return Regex.IsMatch(IP, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$"); }
那么类IPAddress的静态方法TryParse的判断逻辑是怎样的呢?
TryParse方法先判断字符串是否能转换成uint类型数据,不能则返回false,转换成功则将uint数据转换成32位二进制数据,每八位二进制数据转换成十进制数,便转换成了最终的ip地址。像例子中的8转换成32位二进制数据为00000000000000000000000000001000,转换成ip地址为0.0.0.8。
看来以后校验ip地址还是老老实实使用正则吧。
相关文章推荐
- Free IP Address Tracker - 可查看某网段中哪些IP地址已经被使用,哪些未被使用的工具
- CIPAddressCtrl(ip地址控件)使用学习只看楼主 收藏
- 只让用户通过域名访问网站,使用IP不能访问的方法
- IP Helper API 使用方法
- 判断输入字符串是否等效Int32位数字的两种方法:int.TryParse(string s,out int result)和 Try Catch
- 使用DOM4J解析XML及采用Schema校验的方法
- Java网络编程从入门到精通(8):用getAddress方法获得IP地址
- 突破IP屏障,使用代理的方法
- apache中多域名使用同一个ip的方法
- 使用两个IP实现IIS和Apache公用80端口的方法
- 关于weblogic 访问应用直接使用ip就可到达的配置方法
- 诡异的DateTime.TryParseExact方法
- SByte.TryParse 方法 (String, SByte)的C#例子
- 局域网IP地址的非法使用问题解决方法
- 解决IP地址冲突的方法--DHCP SNOOPING 经实验,使用效果非常好
- 使用gethostbyaddr,通过ip地址,得到该ip地址的主机的信息
- 局域网IP地址非法使用问题的解决方法
- 使用WSAIoctl和SIO_ADDRESS_LIST_QUERY去查询本机ip
- Java网络编程从入门到精通(8):用getAddress方法获得IP地址