将IP地址转换为数字:

时间:2010-05-28 10:50:27

标签: .net ip ipv6 ipv4

问题: 当我将IP地址192.168.115.67转换为数字时,它是这样完成的:
192 * 256 3 + 168 * 256 2 + 115 * 256 1 + 67 * 256 0 = 3232265027

或者像这样:
192 * 256 0 + 168 * 256 1 + 115 * 256 2 + 67 * 256 3 = 1131653312

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

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

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

导致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。

答案 2 :(得分:0)

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

说了这么多,我真的不确定问题是什么,所以我只能希望这个说明构成一种答案。

答案 3 :(得分:0)

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