我需要将IPv6从字符串“fe80 :: dd99:5d56:cf09:b1ef”转换为Binary或转换为(Word64,Word64)。最近我来是Network.IP.Addr包,但我是一个新手,这个签名是坚不可摧的对我说:解析IPv6地址
net6Parser :: (CharParsing μ, Monad μ, IsNetAddr n, NetHost n ~ IP6) => μ n
是否有人可以提供一个例子,如何使用它,或推荐其他包?
我需要将IPv6从字符串“fe80 :: dd99:5d56:cf09:b1ef”转换为Binary或转换为(Word64,Word64)。最近我来是Network.IP.Addr包,但我是一个新手,这个签名是坚不可摧的对我说:解析IPv6地址
net6Parser :: (CharParsing μ, Monad μ, IsNetAddr n, NetHost n ~ IP6) => μ n
是否有人可以提供一个例子,如何使用它,或推荐其他包?
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
s?最有效的方法是使用fromIntegral
,位移和逻辑OR。我感觉很懒,所以让我们把它序列化成一个字节串,然后将它反序列化为两个Word64。没有承诺,我有端正确的,但...
> import Data.Binary
> let x = it -- the prior result, the IPv6
> fmap (decode . encode) it :: Maybe (Word64,Word64)
Just (18338657682652659712,15967896581240893935)
虽然托马斯的答案是正确的和有益的,我完全忘了还有的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)
'μn'?有人真的很喜欢他们的unicode,呵呵。 – 2014-09-13 22:22:16