问题:
当我将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 ...
答案 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机器看起来不同。