IP 地址转换器
把 IP 地址在点分十进制、二进制、十六进制与十进制整数之间双向转换。同时支持 IPv4 与 IPv6,输入格式会自动识别。
IPv4 地址的四种写法
一个 IPv4 地址是 32 位。同样的 32 位可以有多种写法,不同的工具和系统需要的写法不同,但它们描述的都是同一个地址。
点分十进制 192.168.1.1 点分二进制 11000000.10101000.00000001.00000001 二进制 11000000101010000000000100000001 十六进制 C0A80101 带前缀十六进制 0xC0A80101 十进制整数 3232235777 八进制 30052000401 反向 DNS 1.1.168.192.in-addr.arpa
这个规律看一遍就能记住,之后所有转换都是机械操作。每个十进制字节恰好对应 8 个二进制位和 2 个十六进制位,所以四种写法只是同一串 32 位的不同分组方式。
手算十进制转二进制
使用位权 128、64、32、16、8、4、2、1。从左到右:如果剩余数值不小于当前位权就写 1 并减去该位权,否则写 0。
示例:把 168 转成二进制
- 168 ≥ 128 → 1,余 40
- 40 < 64 → 0
- 40 ≥ 32 → 1,余 8
- 8 < 16 → 0
- 8 ≥ 8 → 1,余 0
- 0 < 4、0 < 2、0 < 1 → 000
结果:10101000
验算:128 + 32 + 8 = 168。前三位 101 还说明该地址属于 B 类范围,因为首字节在 128–191 之间的地址都以 10 开头。
十进制整数为什么重要
用 32 位整数存储地址比用字符串高效得多:比较和范围查询从字符串操作变成单条指令,范围判断简化为 WHERE ip BETWEEN start AND end。所以地理位置数据库、防火墙规则引擎和路由硬件内部都使用整数形式。
转换本身就是一个加权求和,本页使用无符号 32 位运算完成,因此 127.255.255.255 以上的地址不会出现负数 —— 用 Java 或 C# 的有符号整数实现时这是一个经典 bug。
常见错误
- 把带前导零的字节当十进制处理。 在部分语言里 010 是八进制,等于 8 而不是 10。正因如此 192.168.010.001 会变成安全问题:它能绕过按点分字符串匹配的过滤规则。本页解析器直接拒绝前导零。
- 使用有符号 32 位类型。 128.0.0.0 以上的地址会溢出成负数,导致一半互联网地址的计算结果是错的。
- 把反向 DNS 区域当成字符串的反转。 名称是在字节层面反转并加上后缀,不是简单地逐字符倒过来。
- 以为十六进制总是 8 位。 如果某个工具给出 4 位的值,那只是 16 位的数字,不是一个完整的 IPv4 地址。
常用转换对照
| 说明 | 点分十进制 | 二进制(首字节) | 十六进制 | 十进制 |
|---|---|---|---|---|
| 未指定地址 / 默认路由 | 0.0.0.0 | 00000000 | 00000000 | 0 |
| 环回地址 | 127.0.0.1 | 01111111 | 7F000001 | 2130706433 |
| 第一个 RFC 1918 地址段 | 10.0.0.0 | 00001010 | 0A000000 | 167772160 |
| RFC 1918 172.16 地址块 | 172.16.0.0 | 10101100 | AC100000 | 2886729728 |
| 常见家用网关 | 192.168.1.1 | 11000000 | C0A80101 | 3232235777 |
| 192.168.0.1 变体 | 192.168.0.1 | 11000000 | C0A80001 | 3232235521 |
| Google DNS | 8.8.8.8 | 00001000 | 08080808 | 134744072 |
| Google 备用 DNS | 8.8.4.4 | 00001000 | 08080404 | 134743044 |
| Cloudflare DNS | 1.1.1.1 | 00000001 | 01010101 | 16843009 |
| Quad9 DNS | 9.9.9.9 | 00001001 | 09090909 | 151587081 |
| 链路本地地址(APIPA) | 169.254.0.0 | 10101001 | A9FE0000 | 2851995648 |
| 广播地址 | 255.255.255.255 | 11111111 | FFFFFFFF | 4294967295 |
单独的转换步骤各有专门页面:IP 转二进制、二进制转 IP、IP 转十六进制、十六进制转 IP、IP 转十进制 以及 十进制转 IP。
常见问题
如何把 IP 地址转换成二进制?
把四个字节各自转成 8 位二进制,再用点连接起来。以 192.168.1.1 为例:192 是 11000000,168 是 10101000,1 是 00000001,1 是 00000001,合起来就是 11000000.10101000.00000001.00000001。每个字节互相独立,所以可以按任意顺序转换。
如何把 IP 地址转换成十六进制?
把每个字节转成两位十六进制,然后不带点直接拼接。192.168.1.1 的四个字节分别是 C0、A8、01、01,合起来就是 C0A80101。很多工具会显示成带 0x 前缀或在字节之间加点,但最常用的是这种紧凑的八位写法。
如何把 IP 地址转换成十进制整数?
把 32 位当作一个无符号二进制数。192.168.1.1 的计算过程是 192 × 16,777,216 + 168 × 65,536 + 1 × 256 + 1 = 3,232,235,777。WHOIS 数据库、地理位置 API 以及把地址存成数字的防火墙规则,用的都是这种十进制整数形式。
为什么 IPv4 的十进制最大值是 4,294,967,295?
IPv4 地址是 32 位,而无符号 32 位的最大值是 2^32 − 1 = 4,294,967,295,对应地址 255.255.255.255。更大的数装不进 32 位。这也是为什么有符号 32 位整数无法安全保存 IPv4 地址 —— 高一半会溢出成负数。
IP 地址的反向 DNS 名称是什么?
反向 DNS 把字节顺序颠倒后加上 in-addr.arpa 后缀,所以 8.8.4.4 对应 4.4.8.8.in-addr.arpa。IPv6 同理,但粒度是半字节(4 位),后缀是 ip6.arpa。PTR 记录就是注册在这些名称下,邮件服务器也正是通过查询它们来校验发信主机的。
如何把十六进制还原成 IP 地址?
把八位十六进制按两位一组分成四组,再把每组转成十进制。以 C0A80101 为例:C0 是 192,A8 是 168,01 是 1,01 是 1,得到 192.168.1.1。如果不足八位,先补前导零 —— 四位的十六进制只有 16 位,并不是一个完整地址。
IPv6 地址可以转换成十进制吗?
可以,本页就能做到。结果是 128 位整数,多数地址对应一个 39 位的十进制数。注意很多工具处理不了这么大的数值 —— 64 位整数不够用,必须用 BigInt 或任意精度类型来保存。