NetCalcLab

IP 地址转换器

把 IP 地址在点分十进制、二进制、十六进制与十进制整数之间双向转换。同时支持 IPv4 与 IPv6,输入格式会自动识别。

格式会自动识别。IPv4 支持点分十进制、二进制、十六进制与十进制整数输入。

示例:

IPv4 地址的四种写法

一个 IPv4 地址是 32 位。同样的 32 位可以有多种写法,不同的工具和系统需要的写法不同,但它们描述的都是同一个地址。

192.168.1.1 的各种常见写法
点分十进制     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 转成二进制

  1. 168 ≥ 128 → 1,余 40
  2. 40 < 64 → 0
  3. 40 ≥ 32 → 1,余 8
  4. 8 < 16 → 0
  5. 8 ≥ 8 → 1,余 0
  6. 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 地址。

常用转换对照

常见 IPv4 地址的各种写法对照
说明点分十进制二进制(首字节)十六进制十进制
未指定地址 / 默认路由0.0.0.000000000000000000
环回地址127.0.0.1011111117F0000012130706433
第一个 RFC 1918 地址段10.0.0.0000010100A000000167772160
RFC 1918 172.16 地址块172.16.0.010101100AC1000002886729728
常见家用网关192.168.1.111000000C0A801013232235777
192.168.0.1 变体192.168.0.111000000C0A800013232235521
Google DNS8.8.8.80000100008080808134744072
Google 备用 DNS8.8.4.40000100008080404134743044
Cloudflare DNS1.1.1.1000000010101010116843009
Quad9 DNS9.9.9.90000100109090909151587081
链路本地地址(APIPA)169.254.0.010101001A9FE00002851995648
广播地址255.255.255.25511111111FFFFFFFF4294967295

单独的转换步骤各有专门页面: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 或任意精度类型来保存。