[英]Parsing IPv6 address
我需要將IPv6從字符串轉換為“fe80 :: dd99:5d56:cf09:b1ef”到二進制或轉換為(Word64,Word64)。 我最近來的是Network.IP.Addr包,但我是新手,這個簽名對我來說是難以理解的:
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
? 最有效的方法是使用fromIntegral
,bit shift和邏輯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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.