IP 转二进制
把 IPv4 地址转换为 32 位二进制形式。结果既按字节分段显示,也给出连续的 32 位字符串,方便你看清每个字节边界落在哪里。
转换是怎么做的
IPv4 地址是用点分隔的四个十进制数,其中每个数就是一个字节 —— 8 位。所以转成二进制,就是把四个彼此独立的 0 到 255 的数逐个转成 8 位值。字节之间不存在进位,也没有任何相互影响。
位序号 1 2 3 4 5 6 7 8
位权 128 64 32 16 8 4 2 1
--- -- -- -- -- - - -
取 1 的位 1 1 0 0 0 0 0 0 -> 128 + 64 = 192手工换算时,把剩下的数依次与每个位权比较:大于或等于该位权就写 1 并减掉,否则写 0 继续往下比较。
示例:把 172.16.5.20 转成二进制
172 → 10101100
16 → 00010000
5 → 00000101
20 → 00010100
以 172 为例:172 ≥ 128 记 1,剩 44;44 < 64 记 0;44 ≥ 32 记 1,剩 12;12 < 16 记 0;12 ≥ 8 记 1,剩 4;4 ≥ 4 记 1,剩 0;最后两位都是 0。结果是 10101100,验算 128 + 32 + 8 + 4 = 172。
完整地址:10101100.00010000.00000101.00010100
网络边界落在哪里
二进制真正好用的地方在于配合掩码。把掩码写在地址下面,再按前缀长度画一条线,网络与主机的分界立刻就出来了。
地址 11000000.10101000.00000001.00001010
掩码 11111111.11111111.11111111.00000000
|<------ 网络位 24 位 ------>|<- 主机位 ->|
网络地址 11000000.10101000.00000001.00000000 (192.168.1.0)
广播地址 11000000.10101000.00000001.11111111 (192.168.1.255)网络地址就是把所有主机位置 0 后的地址,广播地址则是把所有主机位置 1。这两种运算各自只是与掩码的一次按位 AND 与按位 OR —— 路由器与主机内部正是这么算的。
常见错误
- 丢掉前导零。10.0.0.1 是 00001010.00000000.00000000.00000001,不是 1010.0.0.1。拼接前必须把每个字节补齐到 8 位。
- 把位序写反。最左边一位是最高位,位权是 128 而不是 1。写反会得到一个看起来合理、实际错误的答案。
- 把地址当成一个 32 位数再整体转换。算出来的数值一样,但会丢掉字节边界,网络与主机的分界就看不清了。
- 忘了 255 就是全 1。以 .255 结尾的广播地址,最后一个字节全是 1,这正是它位于地址块顶部的原因。
参考:字节与二进制对照
子网掩码字节可能出现的九种取值,以及地址中常见的几个字节。
| 十进制 | 二进制 | 十六进制 | 典型用途 |
|---|---|---|---|
| 0 | 00000000 | 00 | 掩码的主机字节、未指定地址 |
| 1 | 00000001 | 01 | 子网内第一个主机 |
| 10 | 00001010 | 0A | 10.0.0.0/8 私有地址块的第二个字节 |
| 128 | 10000000 | 80 | /25 子网掩码字节 |
| 168 | 10101000 | A8 | 192.168.x.x 的第二个字节 |
| 192 | 11000000 | C0 | /26 掩码字节;也是 192.168.x.x 的第一个字节 |
| 224 | 11100000 | E0 | /27 掩码字节;组播地址范围的起点 |
| 240 | 11110000 | F0 | /28 掩码字节 |
| 248 | 11111000 | F8 | /29 掩码字节 |
| 252 | 11111100 | FC | /30 掩码字节 |
| 254 | 11111110 | FE | /31 掩码字节 |
| 255 | 11111111 | FF | /32 掩码字节、广播字节 |
常见问题
如何把 IP 地址转成二进制?
把四个字节各自转成 8 位二进制数,并保留它们之间的点号。以 192.168.1.1 为例,192、168、1、1 分别变成 11000000、10101000、00000001、00000001,合起来是 11000000.10101000.00000001.00000001。去掉点号就是同一个 32 位连续字符串。
为什么总是 32 位?
IPv4 地址固定是 32 位宽,拆成四个 8 位字节。每个字节都必须补齐到 8 位,所以地址 1.1.1.1 的二进制是 00000001.00000001.00000001.00000001,而不是 1.1.1.1。漏写前导零是手工换算中最常见的错误,因为丢掉零会让字节之间的边界变得不明确。
一个字节内的位权分别是多少?
从左到右依次是 128、64、32、16、8、4、2、1。把取值为 1 的位权相加就得到该字节的十进制值,最大值是 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255,这也是字节永远不会超过 255 的原因。
怎么知道网络部分到哪里结束?
看前缀长度。在 192.168.1.10/24 中,前 24 位是网络部分、后 8 位是主机部分,所以二进制会分成 11000000.10101000.00000001 | 00001010。分界线左边的内容标识子网,右边的内容标识该子网内的主机。
IPv6 地址也能转成二进制吗?
可以,但结果是 128 位而不是 32 位,这也是 IPv6 地址通常改用十六进制分组表示的原因。本站的 IPv6 计算器会同时给出完整的 128 位二进制形式与压缩、展开后的十六进制写法。
既然没人会手写二进制,学它有什么用?
因为一旦看到二进制,子网掩码和通配符掩码就变得一目了然。/26 掩码的十进制是 255.255.255.192,几乎看不出含义;但写成 11111111.11111111.11111111.11000000,你可以立刻数出 26 个 1 并看到主机位边界。ACL 的通配符掩码正好是该模式的取反,用二进制来读要不容易出错得多。