You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求将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在范围内

逻辑说明

  1. IP解析:通过net.isIP判断IP版本,用net.toBuffer将IP转为网络字节序(大端)的Buffer,这和Go中net.ParseIP返回的字节数组格式一致。
  2. 字节转BigInt:遍历Buffer的每个字节,通过左移8位(对应一个字节)并按位或的方式,将字节序列拼接为完整的BigInt,与Go中big.Int.SetBytes的逻辑完全匹配。
  3. 范围查询适配:转换后的BigInt可直接存入支持大整数的数据库(如PostgreSQL、MongoDB),后续通过>=/<=(对应gte/lte)即可快速判断IP是否在指定范围内。

内容的提问来源于stack exchange,提问作者RUSSELL HARROWER

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:16:11