2014-09-13 227 views
4

我需要將IPv6從字符串「fe80 :: dd99:5d56:cf09:b1ef」轉換爲Binary或轉換爲(Word64,Word64)。最近我來是Network.IP.Addr包,但我是一個新手,這個簽名是堅不可摧的對我說:解析IPv6地址

net6Parser :: (CharParsing μ, Monad μ, IsNetAddr n, NetHost n ~ IP6) => μ n 

是否有人可以提供一個例子,如何使用它,或推薦其他包?

+1

'μn'?有人真的很喜歡他們的unicode,呵呵。 – 2014-09-13 22:22:16

回答

3

network-ip包似乎使用textual類型的類和它的相關包。看看這個班的文件,我看到提到一個明顯的助手fromString聽起來不錯。一個快速測試表明這是你要找的東西:

> import Data.Textual 
> import Network.IP.Addr 
> fromString "fe80::dd99:5d56:cf09:b1ef" :: Maybe IP6 
Just (ip6FromWords 0xfe80 0x0 0x0 0x0 0xdd99 0x5d56 0xcf09 0xb1ef) 

因此,這工作正常。現在我們如何將這些8 Word16值轉換成Word64s?最有效的方法是使用fromIntegral,位移和邏輯OR。我感覺很懶,所以讓我們把它序列化成一個字節串,然後將它反序列化爲兩個Word64。沒有承諾,我有端正確的,但...

> import Data.Binary 
> let x = it -- the prior result, the IPv6 
> fmap (decode . encode) it :: Maybe (Word64,Word64) 
Just (18338657682652659712,15967896581240893935) 
0

雖然托馬斯的答案是正確的和有益的,我完全忘了還有的getaddrinfo標準功能,我結束了使用它的輸出,如:

fromSockAddr :: SockAddr -> (Word64, Word64) 
fromSockAddr a = case a of 
       -- SockAddrInet pn ha (IPV4 not needed) 
       SockAddrInet6 pn fi ha sid -> decode $ encode ha :: (Word64,Word64)