我一直试图从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!
答案 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)
这可能是因为00X
或0XY
被视为八进制数字,只允许数字0
到7
。数字8
和9
是错误的。