您当前的位置:首页 > 计算机 > 网络通信

IP 地址(主机ID)以 0 开头会降维成八进制

时间:11-22来源:作者:点击数:

环境

win10

ubuntu 20.04

实验

本机 IP 地址为 10.10.68.44,ping 10.10.68.44 肯定可以 ping 通,如下

C:\Users\liyongjun>ping 10.10.68.44

正在 Ping 10.10.68.44 具有 32 字节的数据:
来自 10.10.68.44 的回复: 字节=32 时间<1ms TTL=128
来自 10.10.68.44 的回复: 字节=32 时间<1ms TTL=128
来自 10.10.68.44 的回复: 字节=32 时间<1ms TTL=128
来自 10.10.68.44 的回复: 字节=32 时间<1ms TTL=128

10.10.68.44 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms

如果我们在 44 前面加个 0,即 ping 10.10.68.044,会是什么效果呢?猜想是,IP 地址的格式是点分十进制,前面加个 0,应该没啥影响,但事实并非如此

C:\Users\liyongjun>ping 10.10.68.044

正在 Ping 10.10.68.36 具有 32 字节的数据:
请求超时。
请求超时。
请求超时。
请求超时。

10.10.68.36 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 0,丢失 = 4 (100% 丢失),

为什么呢?难道前面加个 0 就不是十进制了,变成八进制了?那 ping 10.10.68.054 试试呢? 54(八进制) = 44(十进制)

C:\Users\liyongjun>ping 10.10.68.054

正在 Ping 10.10.68.44 具有 32 字节的数据:
来自 10.10.68.44 的回复: 字节=32 时间<1ms TTL=128
来自 10.10.68.44 的回复: 字节=32 时间<1ms TTL=128
来自 10.10.68.44 的回复: 字节=32 时间<1ms TTL=128
来自 10.10.68.44 的回复: 字节=32 时间<1ms TTL=128

10.10.68.44 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms

还真是,而且 ping 10.10.68.54 是 ping 不通的。在 ubuntu 20.04 环境上实验现象一致,所以基本断定数字以 0 开头会使得 IP 地址的点分十进制变成点分八进制,这点在写代码时要多留心,勿要在前面多加 0。

由头

以上是由今天看到的一个 IP 地址的正则表达式匹配规则,想到的两年前遇到的一个现象。再来看一下这个正则表达式

((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])

只看匹配数值的这一个子表达式 (25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9]),这个表达式可以匹配 250-255,200-249,0-199 这几段数值,说白了就是 0-255,这也是没问题的。不过想到了之前遇到的数字以 0 开头,会使得点分十进制变成点分八进制,用八进制表示 0-255 可能就不能被上述正则表达式匹配到了,如 192.168.8.88 也可以写成 192.168.8.0130

C:\Users\liyongjun>ping 192.168.8.0130

正在 Ping 192.168.8.88 具有 32 字节的数据:
来自 192.168.8.88 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.8.88 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.8.88 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.8.88 的回复: 字节=32 时间<1ms TTL=128

192.168.8.88 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms

可见,192.168.8.0130 这个 IP 地址也是合法的,但是使用上述正则表达式不能匹配这个 IP 地址,这也无可厚非,只能说没有尽善尽美的代码。

总结

没有人能够写出没有 BUG 的代码,不过有经验的程序员能够在写代码前就预期到会有哪些坑,尽量去避免。越有经验,就能避免越多的坑。就算有些错误不容易规避,也能对风险有个预期,不至于灾难都降临了,还不知道出错在哪。如此,程序员为什么会有中年危机呢?应该越老越吃香才对,危机是对那些没有积累的人说的。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐