解析IPv6地址

时间:2014-09-13 18:59:55

标签: haskell

我需要将IPv6从字符串转换为“fe80 :: dd99:5d56:cf09:b1ef”到二进制或转换为(Word64,Word64)。我最近来的是Network.IP.Addr包,但我是新手,这个签名对我来说是难以理解的:

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

有人可以提供一个如何使用它的示例,或推荐任何其他包吗?

2 个答案:

答案 0 :(得分: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值合并为Word64个?最有效的方法是使用fromIntegral,位移和逻辑或。我感觉很懒,所以让我们把它序列化为一个字节串,然后将它反序列化为两个Word64。我没有承诺我有正确的结尾但......

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

答案 1 :(得分: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)