2010-05-28 28 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