ホームページ  >  記事  >  バックエンド開発  >  golangのIPアドレスを数値に変換する方法

golangのIPアドレスを数値に変換する方法

PHPz
PHPzオリジナル
2023-04-24 09:10:031023ブラウズ

Golang は、ネットワーク プログラミング タスクを簡素化するように設計された効率的で強力なプログラミング言語です。ネットワーク プログラミングでは、データ処理を高速化するために IP アドレスを数値に変換する必要があることがよくあります。この記事では、Golangを使ってIPを数値に変換する方法を紹介します。

  1. IP アドレスと番号の概念

IP アドレスは、インターネット上のデバイスを識別するために使用されるインターネット プロトコル アドレスです。通常は 4 つの 10 進数 (0 ~ 255) で表され、各数値はドット区切り文字「.」で区切られます。たとえば、192.168.1.1 は IP アドレスです。

数字は、数値を表す記号の体系です。コンピューターでは、数値は 0 と 1 からなる 2 進数で表されます。ネットワーク プログラミングでは、数値は通常、IP アドレスを表す 32 ビットの符号なし整数を指します。

  1. IP アドレスを数値に変換する手順

IP アドレスを数値に変換するプロセスは、次の 4 つのステップに分けることができます。

(1) 変換IP アドレスは 4 桁の 10 進数に分割されます。

(2) 10 進数を 2 進数に変換します。各 10 進数は 8 ビットの 2 進数に対応します。

(3) 4 つの 8 ビット 2 進数を 32 ビット 2 進数に結合します。

(4) 32 ビットの 2 進数を、IP アドレスに対応する 10 進数に変換します。

次は、プロセスを実装するための Golang コードです:

package main

import (
    "fmt"
    "strconv"
    "strings"
)

func main() {
    ip := "192.168.1.1"
    fmt.Println(ipToNum(ip))
}

// IP转数字
func ipToNum(ip string) uint32 {
    defer func() {
        if err := recover(); err != nil {
            return
        }
    }()
    octets := strings.Split(ip, ".")
    if len(octets) != 4 {
        return 0
    }
    var num uint32
    for i, octet := range octets {
        oct, err := strconv.Atoi(octet)
        if err != nil {
            return 0
        }
        if oct > 255 {
            return 0
        }
        num |= uint32(oct) << ((3 - i) * 8)
    }
    return num
}
  1. 数値を IP アドレスに変換する手順

数値を IP アドレスに戻すこともできます。

(1) 32 ビット符号なし整数を 2 進数に変換します。

(2) 32 ビット 2 進数を 4 つの 8 ビット 2 進数に分割します。

(3) 4 つの 8 ビット 2 進数を 10 進数に変換します。

(4) 4 つの 10 進数を結合して 1 つの IP アドレスにします。

次は、このプロセスを実装するための Golang コードです:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    num := uint32(3232235777)
    fmt.Println(numToIp(num))
}

// 数字转IP
func numToIp(num uint32) string {
    return strconv.Itoa(int(num>>24)) + "." + strconv.Itoa(int(num>>16&0xFF)) + "." +
        strconv.Itoa(int(num>>8&0xFF)) + "." + strconv.Itoa(int(num&0xFF))
}
  1. テスト コード

上記の 2 つの関数をテストのためにマージします。

package main

import (
    "fmt"
    "strconv"
    "strings"
)

func main() {
    ip := "192.168.1.1"
    num := uint32(3232235777)
    fmt.Println(ip)
    fmt.Println(num)
    fmt.Println(ipToNum(ip))
    fmt.Println(numToIp(num))
    fmt.Println(ipToNum(numToIp(ipToNum(ip))))
    fmt.Println(numToIp(ipToNum(numToIp(num))))
}

// IP转数字
func ipToNum(ip string) uint32 {
    defer func() {
        if err := recover(); err != nil {
            return
        }
    }()
    octets := strings.Split(ip, ".")
    if len(octets) != 4 {
        return 0
    }
    var num uint32
    for i, octet := range octets {
        oct, err := strconv.Atoi(octet)
        if err != nil {
            return 0
        }
        if oct > 255 {
            return 0
        }
        num |= uint32(oct) << ((3 - i) * 8)
    }
    return num
}

// 数字转IP
func numToIp(num uint32) string {
    return strconv.Itoa(int(num>>24)) + "." + strconv.Itoa(int(num>>16&0xFF)) + "." +
        strconv.Itoa(int(num>>8&0xFF)) + "." + strconv.Itoa(int(num&0xFF))
}
  1. 結論

Golang は効率的で強力なプログラミング言語であるため、ネットワーク プログラミングに非常に適しています。ネットワーク機能を実装するとき、データをより速く処理するために、IP アドレスを数値に変換する必要があることがよくあります。この記事では、読者の参考のために、Golang を使用して IP アドレスと番号を相互に変換する方法を紹介します。

以上がgolangのIPアドレスを数値に変換する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。