求将Go语言IP转Int代码转换为Node.js实现(支持IPv4/IPv6)
IPv4/IPv6 转整数的 Node.js 实现
需求背景
需要将IPv4和IPv6地址转换为整数,用于数据库存储IP范围(起始/结束地址),后续通过gte/lte查询判断目标IP是否在指定范围内。尝试过npm的ip2int包,发现已失效且仅支持IPv4,现需要将给定的Go语言转换逻辑适配到Node.js环境。
Node.js 实现代码
Node.js内置的net模块可用于解析IP地址,结合BigInt处理IPv6的超大整数(避免Number精度丢失),实现与Go代码一致的转换逻辑:
const net = require('net'); function ip2Int(ipStr) { const ipVersion = net.isIP(ipStr); if (ipVersion === 0) { throw new Error('无效的IP地址'); } // 解析IP为网络字节序的Buffer(大端) const ipBuffer = net.isIPv4(ipStr) ? net.toBuffer(ipStr, 'ipv4') : net.toBuffer(ipStr, 'ipv6'); // 将Buffer转换为BigInt let result = 0n; for (const byte of ipBuffer) { result = (result << 8n) | BigInt(byte); } return result; } // 测试示例 console.log(ip2Int('20.36.77.12').toString()); // 对应Go代码输出的336950028 console.log(ip2Int('2001:0db8:85a3:0000:0000:8a2e:0370:7334').toString()); // 对应Go代码输出的325128597695808416735962544859457436692 // IP范围判断示例 const startIp = '35.192.0.0'; const endIp = '35.207.255.255'; const targetIp = '35.200.100.50'; const startInt = ip2Int(startIp); const endInt = ip2Int(endIp); const targetInt = ip2Int(targetIp); console.log(targetInt >= startInt && targetInt <= endInt); // 输出true,说明目标IP在范围内
逻辑说明
- IP解析:通过
net.isIP判断IP版本,用net.toBuffer将IP转为网络字节序(大端)的Buffer,这和Go中net.ParseIP返回的字节数组格式一致。 - 字节转BigInt:遍历Buffer的每个字节,通过左移8位(对应一个字节)并按位或的方式,将字节序列拼接为完整的BigInt,与Go中
big.Int.SetBytes的逻辑完全匹配。 - 范围查询适配:转换后的BigInt可直接存入支持大整数的数据库(如PostgreSQL、MongoDB),后续通过
>=/<=(对应gte/lte)即可快速判断IP是否在指定范围内。
内容的提问来源于stack exchange,提问作者RUSSELL HARROWER
相关产品推荐
相关产品推荐

