目前各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地址:
实测符合预期,编译为exe文件后执行结果:
对于ip前后混杂了其它字符,也能自动清除,如上所示,希望对大家有用。