如何将IP地址解析为Haskell中的IP地址?
答
这里有一个副本就绪解决方案:
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
答
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