今天上网闲逛,本来是为了找找关于版本管理的文章,结果发现一篇讲ping的问题,比较有趣,就关注了一下。

以下为原帖: 小土豆在一个小技巧中,我描述了一个关于ping的技巧。接下来有了一个关于ping的问题,感谢m3rcury提供给我这样一个好的问题。在通常思路看来,ping 218.24.178.155与ping 218.024.178.155会有什么样的区别?我认为是一样的。然而实际却大相径庭。ping 218.24.178.155会如人所愿的ping 218.24.178.155,而ping 218.024.178.155却会到218.20.178.155上去

m3rcury证明了这个问题的操作系统无关性:他在FreeBSD证明了这一点。部分的猜测,是在证明这和进制有关。使用进制转换器,可以看到8进制的24,在10进制下得到了20,但事情并没有想像的那么简单,如果说,ping是在将8进制数转换为10进制,那么是否可以推断ping能够将所有值的8进制转换为10进制?然而218.24.178.155的八进制结果332.30.262.233,在ping的时候却会提示unknow host。此外,一个常识是,这是一个二进制的世界,然而ping似乎却是十进制的。

11011010.10100.10110010.10011011是218.24.178.155的二进制数,但如果ping,同样会提示unknow host。我在寻找答案。

我打开命令提示符,一试,还真是这样,为什么呢?很快我就想到也许原帖的猜测不全对。于是我又做了一个测试,ping 218.0x24.178.155。

由此我们可以看出,其实ping并不会自己对所有值的进制自动进行转换,所以332.30.262.233是个不合法的IP地址。我想,导致这种变化的原因在于C语言中会把0开头的数认作8进制的,而把0x开头的数认作16进制,这就造成了024变成20,0x24变成36。