接受包含IPv4或IPv6地址的字符串並獲取IP號碼的最簡單方法是什麼?如何將IP地址解析爲Haskell中的IP地址?
2
A
回答
3
這裏有一個副本就緒解決方案:
module Program where
import Data.IP
ipToOcts :: IP -> [Int]
ipToOcts (IPv4 ip) = fromIPv4 ip
ipToOcts (IPv6 ip) = fromIPv6b ip
ipToInteger :: IP -> Integer
ipToInteger =
sum . map (\(n,o) -> toInteger o * 256^n) . zip [0..] . reverse . ipToOcts
ipStringToInteger :: String -> Integer
ipStringToInteger = ipToInteger . read
調用示例:
ipStringToInteger "134.244.11.55"
ipStringToInteger "2001:db8:00:00:00:00:00:01"
您需要iproute包爲:
cabal install iproute
2
Data.IP
具有IPv4
和IPv6
支持從字符串解析的類型,以及將它們轉換爲值列表的功能Int
值。
> fromIPv4 . read "192.0.0.1"
[192,0,0,1]
> fromIPv6b . read "2001:0db8::1"
[32,1,13,184,0,0,0,0,0,0,0,0,0,0,0,1]
一旦你的列表,你可以將它摺疊成一個整數,如果你喜歡:
> import Data.List
> foldl' (\acc octet -> 256*acc + fromIntegral octet) 0 [192,0,0,1]
3221225473
(由於這兩個fromIPv4
和fromIPv6
回報[Int]
值,fromIntegeral
確保摺疊可以返回Integer
。)
但是,考慮你是否實際上需要一個整數。您擁有的任何API都將以正確的順序關注單個字節。除了將地址序列化爲二進制文件之外,您可能甚至不需要該地址。
的IP ...多少?你到底在找什麼? 'data IP4 = IP4 Word8 Word8 Word8 Word8',還是C庫的東西? – Zeta
例如「134.244.11.55」,並得到2264140599 我也需要爲IPv6做這件事。 – Vlam
所以你想要一個32位整數的IPv4和一個128位整數的IPv6?或者我想只是一個'整數',我不認爲標準庫中有128位固定寬度的整數。 – Cubic