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

我试图从API结果中解析IP地址,其中IPv4地址的四个中心中的每一个都以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! 

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

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

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

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

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

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