如何将IP地址解析为Haskell中的IP地址?

如何将IP地址解析为Haskell中的IP地址?

问题描述:

接受包含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

这里有一个副本就绪解决方案:

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具有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都将以正确的顺序关注单个字节。除了将地址序列化为二进制文件之外,您可能甚至不需要该地址。