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