基于go语言编写的IPv4转换为IPv6的代码

目前各IP系统正在大量从IPv4转换到IPv6,如何快速有效地按特定规则将v4地址换算成v6地址是一个比较麻烦的事,本例使用go语言编写生成代码来实现转换。

一、规则约定

本环境中对于IPv6参照IPv4进行分配,对原24位掩码的v4地址,则对应到120位的v6地址,将v4地址逐段转换为16进制,拼接成主机地址,再和v6的前缀地址拼接,最后形成完整的v6地址。

示例如下:v6前缀为“fa80:250:5:1”,v4地址为:192.168.0.1

v4地址逐段转换为16进制:192-c0,168-a8,0-0,1-01

转换后的v6地址为:fa80:250:5:1::c0a8:001

二、代码编写

完整测试通过的代码如下:

package main

import (
    "fmt"
    "regexp"
    "strings"
    "strconv"
    "os"
)

//过滤出输入信息中的IP字段
func RegexpIp(str string) []string {
    regstr := `[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}`
    reg, _ := regexp.Compile(regstr)
    s := reg.FindAllString(str, -1)
    return s
}

//将10进制字符转换到16进制数值
func tenTohex(tenstr string) string {
    tenint, err := strconv.ParseInt(tenstr, 10, 64)
    if err != nil {
        fmt.Println(err)
    }
    hexstr := strconv.FormatInt(tenint, 16)
    return hexstr
}


func main() {
    var ipinput string

    if len(os.Args) == 2 {
        ipinput = os.Args[1]
    } else {
        fmt.Println("usage,just like: ipto6 192.168.0.1")
        fmt.Println("请输入IP地址:")
        fmt.Scanln(&ipinput)
    }
    ipget := RegexpIp(ipinput)
    if len(ipget) != 0 {
        //fmt.Println("输入IP的地址是:", ipget[0])
        tenlist := strings.Split(ipget[0], ".")
        ipi1 := tenlist[0]
        ipi2 := tenlist[1]
        ipi3 := tenlist[2]
        ipi4 := tenlist[3]
        fmt.Printf("fa80:250:5:1::%s%02s:%s%02s", tenTohex(ipi1),tenTohex(ipi2),tenTohex(ipi3),tenTohex(ipi4))
     }
}

三、运行测试:

本代码如果直接运行,则会交互式提示输入IP,如果参数中带了v4的ip,则直接生成v6地址:

基于go语言编写的IPv4转换为IPv6的代码_第1张图片

实测符合预期,编译为exe文件后执行结果:

基于go语言编写的IPv4转换为IPv6的代码_第2张图片

对于ip前后混杂了其它字符,也能自动清除,如上所示,希望对大家有用。

你可能感兴趣的:(国产操作系统,运维,linux,linux,服务器,golang)