c# - 使用 IPv6 的 IPAddress.HostToNetworkOrder

标签 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 地址将主机顺序转换为网络顺序?

最佳答案

将 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/

相关文章:

c# - 了解为什么在 Bot Builder Framework 示例 : MultiLingualBot 中似乎进行了三次翻译

c# - 在 C# 中将字符串转换为 double 或任何数字类型变量

tcp - Socat - 无缓冲

python - 中间有负载均衡器时如何跟踪浏览器的IP

macos - Vagrant VirtualBox 无法正确进行端口转发

grails - 在 Grails 中获取 IP 地址

c# - 将 RelayCommand (CommandManager) 从 .Net Framework 移动到 .NET Core v3.0.100-preview3

C# 字典 : faster access but less memory footprint

c++ - TCP recvfrom() 不存储 'from'

php - 在 PHP 中将 IPv6 转换为 IPv4 地址