2010-05-28 27 views
7

问题: 当我的IP地址192.168.115.67转换成一个数字,它是这样完成的:
192 * 256 + 168 * 256 +115 * 256 + 67 * 256 = 3232265027

或这样的:
192 * 256 0 + 168 * 256 + 115 * 256 2 + 67 * 256 = 1131653312

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

我使用1131653312变体,因为1131653312是我看到.NET给出的变体,但是3232265027是我在C++中使用的变体,也是我在Web上发现的用于IPv4到IPv6转换的变体,以及之前我使用过的变体我看到.NET使用变种1131653312 ...转换的IP地址到一个数字:

回答

5

导致3232265027的方法应该是正确的,如在第一号被存储在IPv6中的IPv4兼容性部的最高位:

0000:0000:0000:0000:0000:FFFF:AABB: CCDD

其中

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

http://wikipedia.org/wiki/IPv6

而且,你不能有一个IP地址的256。值是每个0 - 255。

0

数字在网络上以big-endian顺序发送,与写入方式相同(192是最重要的字节)。因此,第一个数字是“正确的”。另一个变体是如何在一个小端架构上解释相同的字节,因此.Net行为。在说了这么多之后,我真的不确定这个问题是什么,所以我只能希望这个博览会构成各种答案。

+0

问题是,(正确的)IP v6如何查找给定的IP v4。 – 2010-05-28 11:39:47

+0

窘境,修改你的答案以说清楚。 – 2010-05-28 11:46:03

5

它绝对是第一个。您可以ping通并查看ping实用程序如何将其转换为a.b.c.d表示法。如果你打算做这种转换,我推荐使用表达式:(a << 24) | (b << 16) | (c << 8) | d

+0

为什么downvoting? – Andrey 2010-05-28 10:59:44

+0

你不能这么说;这取决于他的平台的字节顺序。好吧,我想你可以,因为.NET并没有完全移植到很多不同的平台上。但原则上,你不能这么说。 – 2010-05-28 11:00:51

+0

@ T.E.D。作为一个数字,它会看起来像3232265027.第二个问题是它如何存储在内存中,而这一点我根本没有提到。 – Andrey 2010-05-28 11:12:30

0

endianness的区别在于。您将它存储在一个整数中,但不同的处理器对于它们的整数具有不同的字节顺序(首先大或小)。但是,这个数字必须超出界限,因此IP具有特定的顺序,它需要传输字节。该顺序看起来不同于生物传感器和小型机器。

+0

我不太了解.NET跨越不同的硬件,但是不是.net提供了整数抽象字节转换? – 2012-06-09 01:12:46