2014-09-13 226 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)