2

在 .NET 中,IPAddress.HostToNetworkOrder() 只能接受 long int(64 位)并返回 long。这对 IPv4 来说很好,但 IPv6 地址是 128 位的。我发现将 IPv6 地址存储为整数的唯一方法是这样做:

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

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

4

2 回答 2

2

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

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

由于 IPv6 地址的规模很大,而且如此大的 CPU 原生类型很少见,因此预计不会对 IPv6 地址执行这种算法。

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

于 2013-06-10T20:13:53.843 回答
1

我想到了!

IPAddress ip = IPAddress.Parse("{IP ADDRESS}");
List<Byte> ipFormat = ip.GetAddressBytes().ToList();
ipFormat.Reverse();
ipFormat.Add(0);
BigInteger ipAsInt = new BigInteger(ipFormat.ToArray());
于 2013-06-10T21:22:09.197 回答