IPv4 批量转换实战:把一堆点分十进制 IP 转整数、十六进制再反向还原
讲清楚 IPv4 点分十进制和 32 位整数怎么互转,为什么数据库存整数更省空间,IP 范围比较和 geoip 批量查询为何依赖整数,以及如何在浏览器本地批量处理一整列地址。
IPv4 批量转换实战:把一堆点分十进制 IP 转整数、十六进制再反向还原
运维和后端最常踩的一个坑,是把 IP 当字符串存进数据库,然后在做范围比较时发现 192.168.1.9 排在 192.168.1.10 后面。点分十进制是给人看的,机器更喜欢一个干净的 32 位整数。这篇把转换的算法、落库策略和批量处理流程一次讲透。
点分十进制到底怎么变成 32 位整数
一个 IPv4 地址由四段(octet)组成,每段 8 位,合起来正好 32 位。把它转成整数的公式很直白:从左到右每一段分别乘以 256 的幂,再相加。
具体点说,地址 a.b.c.d 的整数值是:
a × 256³ + b × 256² + c × 256¹ + d × 256⁰
= a × 16777216 + b × 65536 + c × 256 + d
拿 192.168.1.1 算一遍:
192 × 16777216 = 3221225472
168 × 65536 = 11010048
1 × 256 = 256
1 × 1 = 1
-----------------------------
合计 = 3232235777
所以 192.168.1.1 对应的整数就是 3232235777。反向还原也是同一套逻辑:拿整数对 256 连续取模并整除,从低位往高位依次取出 d、c、b、a 四段。十六进制更直接,3232235777 写成 0xC0A80101,每两位十六进制刚好对应一段(C0=192、A8=168、01=1、01=1),调试抓包时一眼就能对上。
为什么数据库存整数比存字符串省空间又快
一个 192.168.100.200 这样的字符串,按 VARCHAR 存最长要占 15 个字节加长度头。换成无符号 32 位整数,固定 4 个字节。一张几百万行的访问日志表,光这一列就能省下一大半空间,索引体积同步缩小,B 树更扁,查得更快。
更关键的是排序和比较。整数列的 BETWEEN、<、> 是真正的数值比较;字符串列的比较是逐字符的字典序,'9' > '10' 这种反直觉结果会让范围查询全错。MySQL 其实内置了 INET_ATON 和 INET_NTOA 做这件事,但很多团队的数据来自 CSV 导出、客服工单或日志抓取,落库前需要先在本地批量清洗成干净的一列,再喂给导入脚本。
IP 范围比较和 geoip 批量查询为什么离不开整数
geoip 数据库的本质,就是一张「起始整数 - 结束整数 - 国家/城市」的区间表。查一个 IP 属于哪个地区,等价于找哪个区间满足 start_int ≤ ip_int ≤ end_int。如果 IP 还是点分字符串,这个区间判断根本没法用普通索引跑。
判断某个地址是否落在某个 CIDR 段里,也是同一个道理。10.0.0.0/8 转成整数后是一段连续区间 [167772160, 184549375],任意一个待查 IP 只要转成整数,一次 BETWEEN 就有答案。批量场景下,先把上万个待查地址整列转成整数,再和区间表做一次 join,远比逐个字符串匹配高效。
我自己的一次批量清洗经历
上个月我接手一份合并自三个来源的白名单,CSV 里混着点分地址、残留的 10.0.0.0/8 网段、多打一段的脏数据,还有从网页复制时带进来的隐藏空白。我没有写一次性脚本,而是直接把整列粘进 IPv4 地址列表转换器,勾上去重和排序,把无效项一起带出来复核。它精确标出了那条多了一段的地址和那个 CIDR 残留,剩下的干净列表我直接导成 SQL IN 子句贴进了导入语句。整个过程没有任何数据离开浏览器,对内网资产清单来说这点很重要。
批量转换的本地处理流程
把一整列地址做格式转换,建议按这个顺序走:
- 粘贴或上传源文本,工具在浏览器本地解析每一段点分四段地址;
- 先规范化,去掉隐藏空白和前导零,避免
192.168.001.001和192.168.1.1被当成两条; - 去重并排序,让输出按数值顺序排列,方便后续做范围切分;
- 保留无效项复核,看清楚哪一行会让 SQL 导入卡住;
- 选择输出格式,逐行、CSV、JSON、SQL IN 或 TypeScript union,直接拿去用。
如果你只是想从一大段日志或网页文本里把地址挑出来,而不需要后续转换,可以用更聚焦的 IPv4 地址提取器,它专门做抽取这一步。两个工具都 100% 在本地跑,不会把源文本发到任何服务器。
几个容易被忽略的细节
格式正确不等于地址真实存在,校验只保证它是合法的点分四段,不代表那台主机在线。从网页复制的文本几乎一定带隐藏空白,导入前务必先规范化再去重,否则去重会漏。需要留审计线索时,别只复制最终列表,导出带行号的 CSV 或 Markdown,回头排查能直接定位到原文哪一行。
把 IP 当整数处理,是网络数据工程里最朴素也最值钱的一个习惯。一旦这列干净了,落库、查 geoip、做范围比较全都顺了。
Made by Toolora · Updated 2026-06-13