首页 文章

带有IPv6的IPAddress.HostToNetworkOrder

提问于
浏览
1

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

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

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

2 回答

  • 1

    将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#,但它的想法是一样的) .

  • 2

    我想到了!

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

相关问题