亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 168 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號