为了账号安全,请及时绑定邮箱和手机立即绑定

IP地址转Int

IP地址转Int

Go
不负相思意 2023-02-06 14:43:58
所以我在将 IPv4 和 IPv6 转换为 Int 时遇到问题,但是我发现了这个方便的 Go 脚本可以做到这一点,但是我需要它用于 NodeJS。我已经尝试过 NPM 中的插件,ip2int但它似乎已损坏,并且仅适用于 IPv4。我想知道是否有人知道如何将 GO 转换为 nodeJS 的 Javascript。据我所知,以下代码在 Go 中有效。package mainimport (    "fmt"    "math/big"    "net")func Ip2Int(ip net.IP) *big.Int {    i := big.NewInt(0)    i.SetBytes(ip)    return i}func main() {    fmt.Println(Ip2Int(net.ParseIP("20.36.77.12").To4()).String())    fmt.Println(Ip2Int(net.ParseIP("2001:0db8:85a3:0000:0000:8a2e:0370:7334").To16()).String())}我们需要将 IP 地址解析为 int 的原因是,当我们收到 IP 地址时,我们可以搜索该 IP 地址是否在我们收集的 IP 地址范围之一内。例如 RAPD 回报 "startAddress": "35.192.0.0",  "endAddress": "35.207.255.255",因此,如果我们将这两个都转换为 int,我们可以将它们存储在我们的数据库中并执行gte或lte搜索并查看 IP 地址是否在任何存储值之间。
查看完整描述

2 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

更新:在 ipv6 的情况下使用 BigInt 以响应下面的评论

请参阅此解决方案

对于 IPv4 使用:

ipv4.split('.').reduce(function(int, value) { return int * 256 + +value })

对于 IPv6,您首先需要解析十六进制值,十六进制值代表 2 个字节:

ipv6.split(':').split(':').map(str => Number('0x'+str)).reduce(function(int, value) { return BigInt(int) * BigInt(65536) + BigInt(+value) })

我还在引用的要点中添加了 ipv6 解决方案。


查看完整回答
反对 回复 2023-02-06
?
POPMUISE

TA贡献1765条经验 获得超5个赞

const IPv4ToInt = ipv4 => ipv4.split(".").reduce((a, b) => a << 8 | b) >>> 0;

和一个简单的 IPv6 实现:


const IPv6ToBigInt = ipv6 => BigInt("0x" + ipv6.toLowerCase().split(":").map(v => v.padStart(4, 0)).join(""));

或更广泛的


// normalizes several IPv6 formats to the long version

// in this format a string sort is equivalent to a numeric sort

const normalizeIPv6 = (ipv6) => {

  // for embedded IPv4 in IPv6.

  // like "::ffff:127.0.0.1"

  ipv6 = ipv6.replace(/\d+\.\d+\.\d+\.\d+$/, ipv4 => {

    const [a, b, c, d] = ipv4.split(".");

    return (a << 8 | b).toString(16) + ":" + (c << 8 | d).toString(16)

  });


  // shortened IPs

  // like "2001:db8::1428:57ab"

  ipv6 = ipv6.replace("::", ":".repeat(10 - ipv6.split(":").length));


  return ipv6.toLowerCase().split(":").map(v => v.padStart(4, 0)).join(":");

}


const IPv6ToBigInt = ipv6 => BigInt("0x" + normalizeIPv6(ipv6).replaceAll(":", ""));


// tests

[

  "2001:0db8:85a3:08d3:1319:8a2e:0370:7344",

  "2001:0db8:85a3:08d3:1319:8a2e:0370:7345", // check precision

  "2001:db8:0:8d3:0:8a2e:70:7344",

  "2001:db8:0:0:0:0:1428:57ab",

  "2001:db8::1428:57ab",

  "2001:0db8:0:0:8d3:0:0:0",

  "2001:db8:0:0:8d3::",

  "2001:db8::8d3:0:0:0",

  "::ffff:127.0.0.1",

  "::ffff:7f00:1"

].forEach(ip => console.log({

  ip,

  normalized: normalizeIPv6(ip),

  bigInt: IPv6ToBigInt(ip).toString() // toString() or SO console doesn't print them.

}));

.as-console-wrapper{top:0;max-height:100%!important}


查看完整回答
反对 回复 2023-02-06
  • 2 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信