在.NET IPAddress.HostToNetworkOrder()中只能接受long int(64位)并返回long。这对于 IPv4 来说没问题,但 IPv6 地址是 128 位。我发现将 IPv6 地址存储为整数的唯一方法是这样做:
BigInteger big = new BigInteger(ip.GetAddressBytes());
如何使用 BigInteger/IPv6 地址将主机顺序转换为网络顺序?
最佳答案
将 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# 的,但这是相同的想法)。
关于c# - 使用 IPv6 的 IPAddress.HostToNetworkOrder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17030926/