我需要将 IPv6 从像 "fe80::dd99:5d56:cf09:b1ef" 这样的字符串转换为二进制或 (Word64,Word64)。我最接近的是 Network.IP.Addr 包,但我是一个新手,这个签名对我来说是难以理解的:
net6Parser :: (CharParsing ?, Monad ?, IsNetAddr n, NetHost n ~ IP6) => ? n
Run Code Online (Sandbox Code Playgroud)
有人可以提供一个如何使用它的示例,或推荐任何其他软件包吗?
该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)
Run Code Online (Sandbox Code Playgroud)
所以效果很好。现在我们如何将这 8 个Word16值放入几个Word64s 中?最有效的方法是使用fromIntegral、位移位和逻辑或。我感觉很懒,所以让我们将其序列化为字节串,然后将其反序列化为两个 Word64。不保证我有正确的字节序,但是......
> import Data.Binary
> let x = it -- the prior result, the IPv6
> fmap (decode . encode) it :: Maybe (Word64,Word64)
Just (18338657682652659712,15967896581240893935)
Run Code Online (Sandbox Code Playgroud)