2011-10-10 28 views
1

轉換值/淨/ TCP6轉換十六進制到IPv6格式在Java從PROC讀

0000000000000000FFFF00000100007F 

::ffff:10.200.0.31 

我所熟悉的變換的IPv4格式:它是僅0100007F 使用hextoString然後獲取字節,並將其傳遞給InetAddress API,我得到的IP地址,如說10.45.34.22。如果我遵循相同的過程在這裏結果是:: FFFF:0:E895:3bc7

如何去了解這個

+0

你是什麼*待* – EJP

+0

我的問題是如何轉換這個十六進制值,以考慮合適的IPv6兼容的格式 – Kavitha

+0

0000000000000000FFFF00000100007F必須下定決心將:: ffff:10.200.0.31 – Kavitha

回答

1

其實,::ffff:0:e895:3bc7是該地址的 「官方」 的形式。類似IPv4的表格::ffff:10.200.0.31(順便說一下,地址不一樣)只是寫它的另一種方式。

我們如何轉換?每對十六進制數字對應一個字節,以及IPv4格式中的每個.分隔的十進制數字。在IPv6格式中,每個:分隔的塊對應於16位(2個字節),並且每個地址的一個「多個零」序列可以縮寫爲::

因此,您的0000000000000000FFFF00000100007F映射到0000:0000:0000:0000:FFFF:0000:0100:007F作爲完整格式的IPv6地址。

如果IPv6地址是映射IPv4地址的某種形式,則RFC在section 5. Text Representation of Special Addresses中定義了另一種格式。最後32位(例如,最後兩個塊,最後4個字節)被小數點形式替換,點分隔。在我們的例子中,0100:007F具有字節0x01,0x00,0x00和0x7f,其對應於1.0.0.127。

看着這個,看起來你有一些字節順序問題。 IPv4映射IPv6地址的格式是:0:0:0:0:0:ffff:‹IPv4›,在您的情況下,它看起來像是每個32位塊內的字節被交換。所以實際上你的地址應該是0000:0000:0000:0000:0000:FFFF:7F00:0001,這可以寫成als ::ffff:127.0.0.1,這是衆所周知的IPv4本地主機地址,映射到IPv4。

因此,我的第一個建議是將來自proc/net/tcp6的字節交換爲正確的順序,然後從中構建一個InetAdress。也許這已經給出了正確的(混合)格式的地址。如果沒有,可以單獨輸出輸出的最低32位,並手動對其進行格式化,或者再次使用InetAdress API將它們格式化爲IPv4。