piapia123
zh

IP 转整数

网络

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

IP 地址与整数互转,两个方向都认:输入 `192.168.1.1` 给出它的各个整数写法,输入 `3232235777` 给出对应的地址。 为什么这件事有个工具值得做?因为「把 IP 存成整数」是数据库里的常规做法 —— 4 字节而不是 15 字节,而且能直接对网段做范围查询。于是每个写过这类表的人都会撞上同一个问题:为什么从数据库里读出来是负数。 答案是 MySQL 的 `INT` 列带符号:`192.168.1.1` 存进去变成 `-1062731519`。所以这里把无符号与有符号分成两行并排给出 —— 有符号那行不是凑数的,它就是很多人来找的答案。 ⚠️ 反方向不猜:输入 `-1` 会报错,而不是替你转成 `255.255.255.255`。它到底是哪个地址取决于当初怎么存的,猜错会得到一个错的防火墙规则。 IPv6 一律按 128 位处理(十进制那行会很长,但不失精度)—— 用普通数字存 128 位会静默丢掉尾数,输出一个看着像但对不上的地址。

功能

  • 两个方向都认:IP → 整数、整数 → IP,也可手动指定方向
  • 无符号与有符号并列两行 —— 直接回答「数据库里为什么是负数」
  • 点分十进制、十六进制、二进制(可选)几种写法一次给全
  • IPv4 映射的 IPv6(`::ffff:192.168.1.1`)会额外给出内嵌的 IPv4
  • 反向解析名(`1.1.168.192.in-addr.arpa`)
  • IPv6 走 128 位整数,不失精度;超出 128 位会报错而不是取模
  • 负数会报错,不替你猜二补数
  • 全部在本机计算

使用方法

  1. 把 IP 地址或整数粘进左侧
  2. 自动判断方向,不合意就手动指定
  3. 结果立刻出现,每一行都能单独复制

常见问题

为什么从数据库里读出来的 IP 是个负数?
因为那个列是有符号的整数。MySQL 的 `INT` 是带符号 32 位,范围是 ±21 亿;而 `192.168.1.1` 对应的无符号值是 3232235777,超出了正数上限,于是按二补数显示成 `-1062731519`。 数据本身没坏,只是同一串比特的另一种读法。要修有两种方向:把列改成 `INT UNSIGNED`,或者读出来时在 SQL 里 `CAST` 一下。这里把两种读法并排列出来,就是为了让你一眼对上。
用整数存 IP 有什么好处?
两个:省空间(4 字节对 15 字节,索引也跟着小)和能做范围查询。 后一个更实用。用字符串存的时候,「找出所有属于 192.168.0.0/16 的记录」只能靠 `LIKE '192.168.%'`(会误伤 `192.168.0.1.example.com` 这种,而且用不上索引),而用整数存只需要 `WHERE ip BETWEEN 3232235520 AND 3232301055` —— 索引直接生效。
`-1` 为什么不能转?明明就是 `255.255.255.255`。
在你那种存法下它确实是,但这里不知道你用的是哪种。同一个 `-1`:按「有符号 32 位」读是 `255.255.255.255`,按「无符号 64 位」读是 `18446744073709551615`,按「Python 的任意精度」读又是另一个数。 猜错一个 IP 的后果可能是一条错的防火墙规则或一条放行了不该放行的记录。所以这里选择报错,并把无符号/有符号两种读法都摆出来 —— 你对着自己的表结构一看就知道是哪个。

相关工具