二进制转 IP
把 32 位二进制串还原为点分十进制 IPv4 地址。带分隔符或不带分隔符都可以,转换器会替你按四个字节分组。
把二进制位按字节分组
点分十进制只是为了让人类好读。IPv4 地址本质上是一个 32 位数,点号只是每 8 位画一条分界线。反过来换算就是把这层呈现方式拆掉:把二进制位重新分成四组、每组八位,再各自求值。
1 0 1 0 1 1 0 0 | | | | | | | | 128 64 32 16 8 4 2 1 <- 位权 取 1 的位:128 + 32 + 8 + 4 = 172 取 0 的位:64、16、2、1 不参与计算
示例:00001010.00000000.00000000.00000001
一组一组来。第一组 00001010 只在 8 这一位取了 1,再加上 2 这一位,得到 10。第二、三组全是 0,得到 0 和 0。最后一组 00000001 只有 1 这一位是 1,得到 1。
结果:10.0.0.1
看第一个字节的前四位是个好用的速判法:0000 是 A 类地址,1000 到 1011 是 B 类,1100 到 1101 是 C 类。
读懂用二进制写的掩码
掩码用二进制表示最自然,因为掩码的定义就是"一串 1 后面跟一串 0"。用点分十进制你得记住哪些字节值合法;用二进制只需要数个 1 的个数。
| 二进制掩码 | 点分十进制 | 前缀 | 可用主机 |
|---|---|---|---|
| 11111111.11111111.11111111.00000000 | 255.255.255.0 | /24 | 254 |
| 11111111.11111111.11111111.10000000 | 255.255.255.128 | /25 | 126 |
| 11111111.11111111.11111111.11000000 | 255.255.255.192 | /26 | 62 |
| 11111111.11111111.11111111.11100000 | 255.255.255.224 | /27 | 30 |
| 11111111.11111111.11111111.11110000 | 255.255.255.240 | /28 | 14 |
| 11111111.11111111.11111111.11111000 | 255.255.255.248 | /29 | 6 |
| 11111111.11111111.11111111.11111100 | 255.255.255.252 | /30 | 2 |
| 11111111.11111111.11111111.11111110 | 255.255.255.254 | /31 | 2(RFC 3021) |
掩码末尾的那串 0 就是主机位。数它们是最快的定尺寸方法:8 个主机位给 256 个地址,7 个给 128 个,依次类推。
常见错误
- 补零补到错误的一侧。缺的位永远缺在左边,因为是前导零。往右边补零会彻底改变这个地址。
- 从右往左读位。第一位(最左边)的位权是 128。方向读反会得到一个看似合理、实际完全镜像的数。
- 位数不足 32 位时仍从右往左分组。字符串偏短时,先把它补齐到 32 位,然后再分成四个字节。
- 以为全是 1 的字节一定就是广播地址。只有当前缀把最后一个字节划进主机位时,255 才是广播地址。在 /16 里,10.0.255.1 是一个完全普通的主机地址。
值得记住的二进制模式
| 起始位 | 第一个字节范围 | 含义 |
|---|---|---|
| 00000000 | 0 | 本网络 / 未指定地址 |
| 00000001 – 01111110 | 1 – 126 | A 类公网地址空间 |
| 01111111 | 127 | 环回地址范围 |
| 10000000 – 10111110 | 128 – 190 | B 类公网地址空间 |
| 10111111 | 191 | B 类地址范围上界 |
| 11000000 – 11011111 | 192 – 223 | C 类公网地址空间 |
| 11100000 – 11101111 | 224 – 239 | 组播地址(D 类) |
| 11110000 – 11111111 | 240 – 255 | 保留地址(E 类) |
| 11111111.11111111... | 255.255... | 广播地址或全 1 掩码 |
常见问题
如何把二进制转成 IP 地址?
把 32 位分成四组、每组八位,逐组转成十进制后用点号连接。以 11000000.10101000.00000001.00000001 为例,四组分别是 11000000、10101000、00000001、00000001,对应 192、168、1、1,合起来就是 192.168.1.1。
我的二进制没有分隔符怎么办?
从左往右按八位一组切开即可。位序是固定的,永远从最高位开始,所以 11000000101010000000000100000001 会明确地切成 11000000 10101000 00000001 00000001。如果字符串不是正好 32 位,它就不是一个完整的 IPv4 地址 —— 要在左侧补零,而不是在右侧补。
为什么我的二进制只有 31 位或 30 位?
这说明某处的某个前导零被丢掉了。每个字节必须贡献正好八位,总数永远是 32 位。在前面补零就能把缺失的位找回来:1100000101010000000000010000001 不是合法输入,但补齐到 32 位后就是一个有意义的地址。
怎么手工把一组 8 位转成十进制?
把每一位乘以它的位权 —— 128、64、32、16、8、4、2、1 —— 再相加。10101100 就是 128 + 32 + 8 + 4 = 172,因为 64、16、2、1 这几位都是 0。
全是 1 的二进制表示什么?
11111111 就是 255。全为 1 的地址(11111111.11111111.11111111.11111111)是 255.255.255.255,即受限广播地址,会被送到本地链路上的每一台主机,且永远不会被路由转发。
带空格或短横线的二进制串也能转吗?
可以。转换器会先去掉点号、空格等分隔符再分组,所以 11000000 10101000 00000001 00000001 与 11000000.10101000.00000001.00000001 都会得到 192.168.1.1。分组时任何非 0 非 1 的字符都会被忽略,但剩下的位数必须正好是 32 位。