Go语言:IPv6解析转换成BigInt整形以及与IPv4的兼容

6 篇文章 0 订阅

IPv6协议文档是RFC4291,128bit(16个字节),以冒号分隔,允许用双冒号"::"来压缩表示一串连续的0,但"::"只能使用一次。

  • "0:0:0:0:0:ffff:0:0" -- "0:0:0:0:0:ffff:255.255.255.255" 用于将IPv4映射到IPv6
  • "0:0:0:0:0:0:0.0.0.0"--"0:0:0:0:0:0:255.255.255.255" 能兼容IPv4的IPv6 (这个概念已废弃)

相关文章:《Go语言:整形数字字符串转换为IPv6地址字符串》

解析与转换示例:

package main

import (
	"errors"
	"fmt"
	"math/big"
	"net"
)

func Ipv6ToInt(ip net.IP) (*big.Int, error) {
	if ip == nil {
		return nil, errors.New("invalid ipv6")
	}
	IPv6Int := big.NewInt(0)
	IPv6Int.SetBytes(ip)
	return IPv6Int, nil
}

func convert(ipv6 string) {
	ip := net.ParseIP(ipv6)
	bi, err := Ipv6ToInt(ip)
	if err != nil {
		fmt.Printf("ip=%v err=%v\n", ipv6, err)
		return
	}
	fmt.Printf("parsed=%v number=%v\n", ip, bi)
}

func main() {
	fmt.Printf("\n---- IPv6常见例子 ----\n")
	convert("2c0f:ffa1:0:0:0:0:0:0")
	convert("2801:0137:ffff:ffff:ffff:ffff:ffff:ffff")
	convert("2801:0137::ffff:ffff:ffff")
	convert("::")
	convert("2801::")
	convert("::ffff")

	fmt.Printf("\n---- 非法IPv6 ----\n")
	//多个"::"
	convert("2801:0137::ffff:ffff::ffff")
	//取值超限
	convert("2801:0137::ffff:ffff::ffffa1")
	//少于16个字节
	convert("2801:0137:ffff:ffff:ffff")

	/*
			2.5.5.1.  IPv4-Compatible IPv6 Address

		   |                80 bits               | 16 |      32 bits        |
		   +--------------------------------------+--------------------------+
		   |0000..............................0000|0000|    IPv4 address     |
		   +--------------------------------------+----+---------------------+

			The "IPv4-Compatible IPv6 address" is now deprecated because the
			current IPv6 transition mechanisms no longer use these addresses.
			New or updated implementations are not required to support this
			address type.
	*/
	fmt.Printf("\n---- 能兼容IPv4的IPv6 (这个概念已废弃) ----\n")
	convert("0:0:0:0:0:0:0.0.0.0")
	convert("0:0:0:0:0:0:255.255.255.255")

	convert("0:0:0:0:0:0:10.2.3.45")
	convert("0:0:0:0:0:0:a02:32d")
	convert("::10.2.3.45")
	convert("::a02:32d")

	/*
		   2.5.5.2.  IPv4-Mapped IPv6 Address

		   |                80 bits               | 16 |      32 bits        |
	       +--------------------------------------+--------------------------+
	       |0000..............................0000|FFFF|    IPv4 address     |
	       +--------------------------------------+----+---------------------+

	*/
	fmt.Printf("\n---- IPv4映射成IPv6 ----\n")
	convert("0:0:0:0:0:ffff:0:0")
	convert("0:0:0:0:0:ffff:255.255.255.255")

	convert("10.2.3.45")
	convert("0000:0000:0000:0000:0000:ffff:10.2.3.45")
	convert("0000:0000:0000:0000:0000:ffff:a02:32d")
	convert("0:0:0:0:0:ffff:10.2.3.45")
	convert("0:0:0:0:0:ffff:a02:32d")
	convert("::ffff:10.2.3.45")
	convert("::ffff:a02:32d")

}

输出:


---- IPv6常见例子 ----
parsed=2c0f:ffa1:: number=58569101037597416794711927206927400960
parsed=2801:137:ffff:ffff:ffff:ffff:ffff:ffff number=53174336847441874194254142093255507967
parsed=2801:137::ffff:ffff:ffff number=53174336768213711679990085974688268287
parsed=:: number=0
parsed=2801:: number=53174312128255169743780812907543003136
parsed=::ffff number=65535

---- 非法IPv6 ----
ip=2801:0137::ffff:ffff::ffff err=invalid ipv6
ip=2801:0137::ffff:ffff::ffffa1 err=invalid ipv6
ip=2801:0137:ffff:ffff:ffff err=invalid ipv6

---- 能兼容IPv4的IPv6 (这个概念已废弃) ----
parsed=:: number=0
parsed=::ffff:ffff number=4294967295
parsed=::a02:32d number=167904045
parsed=::a02:32d number=167904045
parsed=::a02:32d number=167904045
parsed=::a02:32d number=167904045

---- IPv4映射成IPv6 ----
parsed=0.0.0.0 number=281470681743360
parsed=255.255.255.255 number=281474976710655
parsed=10.2.3.45 number=281470849647405
parsed=10.2.3.45 number=281470849647405
parsed=10.2.3.45 number=281470849647405
parsed=10.2.3.45 number=281470849647405
parsed=10.2.3.45 number=281470849647405
parsed=10.2.3.45 number=281470849647405
parsed=10.2.3.45 number=281470849647405

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值