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

时间:2016-09-30 08:09:05

标签: haskell ip

获取包含IPv4或IPv6地址的字符串并获取IP号码的最简单方法是什么?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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实际上都会以正确的顺序关注各个字节。除了将地址序列化为二进制文件之外,您可能甚至不需要它。

答案 2 :(得分:0)

2018年发布了ip软件包,非常方便。

解码

λ> import Net.IP
λ> :set -XOverloadedStrings
λ> decode "127.0.0.1"
Just (ipv4 127 0 0 1)
λ> decode "2a02:2450:dd1f:0:7646:a0ff:fe91:67b1"
Just (ipv6 0x2a02 0x2450 0xdd1f 0x0000 0x7646 0xa0ff 0xfe91 0x67b1)

编码

λ> encode (ipv4 127 0 0 1)
"127.0.0.1"
λ> encode (ipv6 0x2a02 0x2450 0xdd1f 0x0000 0x7646 0xa0ff 0xfe91 0x67b1)
"2a02:2450:dd1f::7646:a0ff:fe91:67b1

package提供了Attoparsec集成。