NetCalcLab

IP 转十六进制

把 IPv4 地址转换为 8 位十六进制形式。既给出裸值,也给出带 0x 前缀的编程字面量,并附每个字节的推算过程。

请输入点分十进制地址,例如 10.0.0.1。

示例:

十六进制为什么和 IPv4 这么契合

十六进制是 16 进制,而 16 等于 2 的 4 次方,所以每一位十六进制数字恰好对应 4 个二进制位,不会有任何舍入。这让十六进制成为二进制的一种紧凑且无损的简写。由于 IPv4 的每个字节是 8 位,它就永远正好是两位十六进制数字 —— 没有补位规则、没有歧义、没有例外。

192.168.1.1 转十六进制
字节    192   168     1     1
二进制  11000000 10101000 00000001 00000001
半字节  1100 0000 1010 1000 0000 0001 0000 0001
十六进制 C    0    A    8    0    1    0    1
结果    C0A80101

把每个字节拆成两个半字节,就是二进制与十六进制之间的桥梁:前一个半字节是高 4 位,后一个是低 4 位。

手工把十进制字节转成十六进制

把十进制值除以 16,商就是第一位十六进制数字,余数是第二位。0 到 9 直接写 0 到 9,10 到 15 分别写成 A 到 F。

示例:换算 172 与 16

172 ÷ 16 = 10 余 12。10 对应 A、12 对应 C,所以 172 是 AC。接着 16 ÷ 16 = 1 余 0,得到 10。于是 172.16 这一对变成 AC10。

172.16.0.1 → AC100001 → 0xAC100001

一个很好用的验算技巧:第一个字节的首位十六进制数字能看出地址类别。首位是 0 或 1 表示第一个字节小于 32,C 和 D 表示 192 到 223,E 和 F 表示 224 以上,也就是组播或保留地址。

哪些地方会出现十六进制的地址

  • 抓包与协议首部。Wireshark 会同时用点分十进制和十六进制显示地址,而 IP 首部本身就以原始字节保存地址 —— 所以在十六进制编辑器里,192.168.1.1 显示为 C0 A8 01 01。
  • 防火墙与路由表。不少平台用十六进制或十六进制掩码对来保存地址范围,因为掩码运算在一个机器字上就是一次按位 AND。
  • IPv4 映射的 IPv6 地址。32 位形式出现在最后八位十六进制数字上,所以 ::ffff:C0A80101 就是 192.168.1.1 的 IPv6 表示。
  • 源码与配置。任何需要 32 位字面量的地方,0x 前缀都能把它与十进制区分开。

常见错误

  • 漏掉一对中的前导零。字节 1 应写成 01,不是 1。少一位会让后面每一对都错位,最终得到一个错误的地址。
  • 把 10 和 A 搞混。十进制数 10 是单个十六进制数字 A,而不是两个数字 "10"。该写 A 的地方写 10,会得到一个九位的值。
  • 把字节序写反。C0A80101 与 0101A8C0 不是一回事。字节序转换是另一项操作,通常在 32 位整数上做,而不是在文本形式上做。
  • 在代码里忘了前缀。不带 0x 的字面量 10101010 是一个十进制数,而不是字节值 170。

另见: IP 转二进制 · 二进制转 IP · 十六进制转 IP · IP 转十进制 · 十进制转 IP

参考:常见地址的十六进制形式

常见 IPv4 地址及其十六进制形式
地址说明十六进制0x 字面量
0.0.0.0未指定 / 默认路由000000000x00000000
10.0.0.110/8 私有地址块的第一个主机0A0000010x0A000001
127.0.0.1环回地址7F0000010x7F000001
169.254.1.1链路本地地址(APIPA)A9FE01010xA9FE0101
172.16.0.1172.16/12 私有地址块的第一个主机AC1000010xAC100001
192.168.0.1常见家庭网关C0A800010xC0A80001
192.168.1.1常见家庭网关C0A801010xC0A80101
198.51.100.1RFC 5737 文档用地址范围C63364010xC6336401
8.8.8.8公共 DNS 解析器080808080x08080808
255.255.255.255受限广播地址FFFFFFFF0xFFFFFFFF

反向转换:十六进制转 IP。其他转换:IP 转二进制、IP 转十进制、完整 IP 转换器。

常见问题

如何把 IP 地址转成十六进制?

把每个字节转成两位十六进制数字再拼接起来。以 192.168.1.1 为例:192 是 C0,168 是 A8,1 是 01,1 是 01,合起来就是 C0A80101。每个字节恰好一个字节,而一个字节恰好是两位十六进制数字,所以 IPv4 地址永远是八位十六进制数字。

为什么每个字节是两位十六进制数字?

一位十六进制数字表示 4 位,两位就表示 8 位 —— 正好一个字节。一位十六进制数字能表达 16 个值(0-9 与 A-F),而 2^4 = 16,这正是 16 进制与二进制、与字节边界配合得如此整齐的原因。

要不要带 0x 前缀?

看场合。在 C、Rust、Go 等大多数编程语言里必须带 0x,编译器才知道这是十六进制字面量。而在配置文件、日志和协议首部里,通常写不带前缀的八位形式。本页两种都会给出。

怎么手工把十进制字节转成十六进制?

除以 16 并取余数。以 192 为例:192 ÷ 16 = 12 余 0,而 12 在十六进制里是 C,所以两位是 C 和 0,得到 C0。再看 168:168 ÷ 16 = 10 余 8,10 对应 A,得到 A8。10 到 15 分别对应 A、B、C、D、E、F。

怎么把十六进制转回 IP 地址?

把八位数字拆成四对,再逐对转成十进制。以 C0A80101 为例:C0 是 12 × 16 + 0 = 192,A8 是 10 × 16 + 8 = 168,01 是 1,01 是 1,得到 192.168.1.1。反向转换可以用十六进制转 IP 页面。

为什么有时看到带点号或冒号的十六进制?

成对之间的点号或冒号只是为了便于阅读,并不是值的一部分。C0.A8.01.01 与 C0:A8:01:01 都表示 C0A80101。有些厂商格式采用这种写法,让人不用从左数就能看出哪一段是哪个字节。