簡體   English   中英

如何在Haskell中將IP地址解析為IP號?

[英]How to parse IP address into IP number in Haskell?

獲取包含IPv4或IPv6地址的字符串並獲取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具有支持從字符串進行解析的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都會以正確的順序關注各個字節。 除了將地址序列化為二進制文件之外,您甚至可能不需要它。

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

軟件包提供Attoparsec集成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM