为什么IPAddress.Parse(“192.168.001.001”)有效,而IPAddress.Parse(“192.168.001.009”)没有?

时间:2015-10-08 22:39:04

标签: c# .net-4.5

我一直试图从API结果中解析IP地址,其中IPv4地址的四个pat中的每一个都以0(零)为前缀。像这样:

127.000.000.001而不是127.0.0.1

我在尝试解析192.168.001.009时开始出现解析错误。它也失败了192.168.001.008,但适用于007,006,005到001 !!!

它也失败了192.168.001.018,但适用于.017,.016降至010!

适用于192.168.001.8或.8以及192.168.001.18和.19 ......

这是CLR中的错误吗?或者我错过了一些愚蠢的东西?

试试吧:

IPAddress.Parse("192.168.001.007"); // works
IPAddress.Parse("192.168.001.87"); // works
IPAddress.Parse("192.168.001.008"); // throws exception
IPAddress.Parse("192.168.001.19"); // works
IPAddress.Parse("192.168.001.019");  // throws exception
// and so on!

2 个答案:

答案 0 :(得分:12)

数字,因为它们从0开始,被解释为八进制而不是十进制。这些不是C#文字,因此由图书馆以某种方式解释它。

测试它的一种简单方法是构造一个以“.010”结尾的IP,解析它,你会看到它被解析为.8中的ip结尾。

一种可能的快速而肮脏的解决方案是搜索正则表达式/\.0*/并将其替换为“。”

您可以在维基百科条目中找到有关Dot-decimal-notation的更多信息:

  

一种流行的IP网络实现,源自4.2BSD,包含一个函数inet_aton(),用于将字符串表示中的IP地址转换为内部二进制存储。除了基本的四位小数格式和完整的32位地址外,它还支持octet.24bits的中间语法(例如10.1234567;用于A类地址)和octet.octet.16bits(例如172.16.12345;用于B类地址) )。它还允许数字以十六进制和八进制写入,分别用0x和0作为前缀。这些功能在今天仍然受到软件的支持,即使它们被视为非标准功能。但这也意味着IP地址组件写入前导零位的地址可能会被不同的程序解释不同:有些会忽略前导零,有些会将数字解释为八进制。

答案 1 :(得分:6)

这可能是因为00X0XY被视为八进制数字,只允许数字07。数字89是错误的。