IP地址转Int

所以我在将 IPv4 和 IPv6 转换为 Int 时遇到问题,但是我发现了这个方便的 Go 脚本可以做到这一点,但是我需要它用于 NodeJS。


我已经尝试过 NPM 中的插件,ip2int但它似乎已损坏,并且仅适用于 IPv4。


我想知道是否有人知道如何将 GO 转换为 nodeJS 的 Javascript。据我所知,以下代码在 Go 中有效。


package main


import (

    "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 地址是否在任何存储值之间。


不负相思意
浏览 136回答 2
2回答

慕的地8271018

更新:在 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 解决方案。

POPMUISE

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 sortconst normalizeIPv6 = (ipv6) => {&nbsp; // for embedded IPv4 in IPv6.&nbsp; // like "::ffff:127.0.0.1"&nbsp; ipv6 = ipv6.replace(/\d+\.\d+\.\d+\.\d+$/, ipv4 => {&nbsp; &nbsp; const [a, b, c, d] = ipv4.split(".");&nbsp; &nbsp; return (a << 8 | b).toString(16) + ":" + (c << 8 | d).toString(16)&nbsp; });&nbsp; // shortened IPs&nbsp; // like "2001:db8::1428:57ab"&nbsp; ipv6 = ipv6.replace("::", ":".repeat(10 - ipv6.split(":").length));&nbsp; return ipv6.toLowerCase().split(":").map(v => v.padStart(4, 0)).join(":");}const IPv6ToBigInt = ipv6 => BigInt("0x" + normalizeIPv6(ipv6).replaceAll(":", ""));// tests[&nbsp; "2001:0db8:85a3:08d3:1319:8a2e:0370:7344",&nbsp; "2001:0db8:85a3:08d3:1319:8a2e:0370:7345", // check precision&nbsp; "2001:db8:0:8d3:0:8a2e:70:7344",&nbsp; "2001:db8:0:0:0:0:1428:57ab",&nbsp; "2001:db8::1428:57ab",&nbsp; "2001:0db8:0:0:8d3:0:0:0",&nbsp; "2001:db8:0:0:8d3::",&nbsp; "2001:db8::8d3:0:0:0",&nbsp; "::ffff:127.0.0.1",&nbsp; "::ffff:7f00:1"].forEach(ip => console.log({&nbsp; ip,&nbsp; normalized: normalizeIPv6(ip),&nbsp; bigInt: IPv6ToBigInt(ip).toString() // toString() or SO console doesn't print them.}));.as-console-wrapper{top:0;max-height:100%!important}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go