带有IPv6的IPAddress.HostToNetworkOrder

时间:2013-06-10 19:00:55

标签: c# ip ip-address ipv6 biginteger

在.NET中,IPAddress.HostToNetworkOrder()只能接受一个long int(64位)并返回一个long。这适用于IPv4,但IPv6地址是128位。我发现将IPv6地址存储为整数的唯一方法是执行此操作:

BigInteger big = new BigInteger(ip.GetAddressBytes());

如何使用BigInteger / IPv6地址从主机订单转换为网络订单?

2 个答案:

答案 0 :(得分:2)

将IP地址转换为主机字节顺序的目的是使用CPU的普通整数类型对其进行算术运算。例如,在IPv4中:

network_base_address = address & (0xffffffff ^ ((1 << (32-prefix_length)) - 1)

由于IPv6地址的大小和CPU本机类型的稀有性很大,因此不期望这种算法会在IPv6地址上执行。

相反,您可以操作存储为16字节数组的原始IP地址(以网络字节顺序)。例如,虽然C宏IN_MULTICAST(对于IPv4)的通常实现通过对IP地址的整数值进行位掩码来实现,但是C宏IN6_IS_ADDR_MULTICAST的通常实现不是通过处理IP地址作为整数,但通过检查在字节数组中找到的IP地址的第一个字节。 (我知道这些信息适用于C,你的问题是关于C#,但它的想法是一样的。)

答案 1 :(得分:1)

我明白了!

IPAddress ip = IPAddress.Parse("{IP ADDRESS}");
List<Byte> ipFormat = ip.GetAddressBytes().ToList();
ipFormat.Reverse();
ipFormat.Add(0);
BigInteger ipAsInt = new BigInteger(ipFormat.ToArray());