2016-09-30 153 views
2

接受包含IPv4或IPv6地址的字符串並獲取IP號碼的最簡單方法是什麼?如何將IP地址解析爲Haskell中的IP地址?

+0

的IP ...多少?你到底在找什麼? 'data IP4 = IP4 Word8 Word8 Word8 Word8',還是C庫的東西? – Zeta

+0

例如「134.244.11.55」,並得到2264140599 我也需要爲IPv6做這件事。 – Vlam

+0

所以你想要一個32位整數的IPv4和一個128位整數的IPv6?或者我想只是一個'整數',我不認爲標準庫中有128位固定寬度的整數。 – Cubic

回答

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具有IPv4IPv6支持從字符串解析的類型,以及將它們轉換爲值列表的功能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 

(由於這兩個fromIPv4fromIPv6回報[Int]值,fromIntegeral確保摺疊可以返回Integer。)

但是,考慮你是否實際上需要一個整數。您擁有的任何API都將以正確的順序關注單個字節。除了將地址序列化爲二進制文件之外,您可能甚至不需要該地址。