簡體   English   中英

解析IPv6地址

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM