【问题标题】:Converting an IP address to a number:将 IP 地址转换为数字:
【发布时间】:2011-02-25 01:54:36
【问题描述】:

问题: 当我将 IP 地址 192.168.115.67 转换为数字时,是这样完成的:
192*2563 + 168*2562+115*2561+67*2560 = 3232265027

或者像这样:
192*2560 + 168*2561+115*2562+67*2563 = 1131653312

我在网上找到了这两种变体,坦率地说,只要我使用相同的转换过程变体进行所有内部 IP 范围比较,这并不重要。 但我想从 IPv4 地址计算 IP V6,而且似乎这两种变体都在网络上...... 导致不同的IPv6地址,只有一个可以是正确的......

我使用 1131653312 变体,因为 1131653312 是我看到 .NET 给我的变体,但 3232265027 是我在 C++ 中使用的变体,这也是我在网上找到的用于 IPv4 到 IPv6 转换的变体,并且我在看到 .NET 使用变体 1131653312 之前使用过...

【问题讨论】:

    标签: .net ip ipv6 ipv4


    【解决方案1】:

    绝对是第一个。您可以 ping 并查看 ping 实用程序如何将其转换为 a.b.c.d 表示法。如果您要进行此转换,我建议您使用表达式:(a << 24) | (b << 16) | (c << 8) | d

    【讨论】:

    • 你不能这么说;这取决于他平台的字节序。好的,我想你可以,因为 .NET 并没有完全移植到很多不同的平台上。但原则上,你不能真的这么说。
    • @T.E.D.作为一个数字,它看起来像 3232265027。第二个问题是它是如何存储在内存中的,这一点我根本没有提到。
    • 很好,ping 实用程序确认了它。不知道它适用于普通数字。
    【解决方案2】:

    产生3232265027的方法应该是正确的,因为第一个数字存储在IPv6的IPv4兼容性部分的最高位中:

    0000:0000:0000:0000:0000:ffff:AABB:CCDD

    在哪里

    AA = 192
    BB = 168
    CC = 0
    DD = 1

    等等

    https://wikipedia.org/wiki/IPv6

    另外,IP 地址中不能有256。值分别为 0 - 255。

    【讨论】:

      【解决方案3】:

      数字通过线路以大端顺序发送,这与它们的写入方式相同(192 是最高有效字节)。因此,第一个数字是“正确”的数字。另一个变体是如何在 little-endian 架构上解释相同的字节,因此是 .Net 行为。

      说了这么多,我真的不知道问题是什么,所以我只能希望这个阐述构成某种答案。

      【讨论】:

      • 问题是,(正确的)IP v6 如何查找给定的 IP v4。
      【解决方案4】:

      区别在于endianness。您将它存储在一个整数中,但不同的处理器对其整数有不同的字节顺序(大端或小端优先)。但是,该数字必须超出线路,因此 IP 有一个特定的顺序,它需要传输的字节。该顺序看起来与 bigendian 和 littleendian 机器不同。

      【讨论】:

      • 我不太了解.net 跨不同硬件,但是.net 不应该对整数进行抽象字节移位吗?
      猜你喜欢
      • 2017-07-01
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      相关资源
      最近更新 更多