が整数に変換すると範囲を確認することによって、私が試みたエリクサー:
Given IP: 49.14.1.2
Ranges: 49.14.0.0 - 49.14.63.255, 106.76.96.0 - 106.76.127.255, and so on
これらの複数の範囲内の所定のIP存在するか否かをチェックする必要がある特定の範囲内のIP存在を確認します。整数に変換せずにIP自体で行う他の方法はありますか
が整数に変換すると範囲を確認することによって、私が試みたエリクサー:
Given IP: 49.14.1.2
Ranges: 49.14.0.0 - 49.14.63.255, 106.76.96.0 - 106.76.127.255, and so on
これらの複数の範囲内の所定のIP存在するか否かをチェックする必要がある特定の範囲内のIP存在を確認します。整数に変換せずにIP自体で行う他の方法はありますか
アドレスをタプル形式に変換して:inet.parse_address/1
を使用し、シンプルなタプル比較を使用して比較してください。
iex(33)> a_ip = :inet.parse_address(a)
{:ok, {49, 14, 1, 2}}
iex(34)> low_ip = :inet.parse_address(low)
{:ok, {49, 14, 0, 0}}
iex(35)> high_ip = :inet.parse_address(high)
{:ok, {49, 14, 63, 255}}
iex(36)> a_ip < low_ip
false
iex(37)> a_ip > low_ip
true
iex(38)> a_ip < high_ip
true
iex(39)> a_ip > high_ip
false
おかげさまで、IPレンジがほぼ100であるため、各レンジでの特定のIPの存在を確認する最適な方法はありますか? –
比較文字列があなたのニーズに合わないことに注意してください。例えば、 "25.12.14.10" <"25.12.5.10"文字列比較の場合はtrueです.IPアドレスの比較では明らかにfalseです。あなたの目的のためにタプル表現がはるかに良いならば、 '{IpMin、IpMax}'の範囲表現を持つことができます。ここで 'IpMin'と' IpMax'は4要素タプルです: '{XX、YY、ZZ、TT} – Pascal
ありがとう@Pascal、私はそれらのケースを逃した。私はそれに応じて答えを更新します。 – evnu
テール再帰関数を使用して大きなリストを処理し、それぞれをチェックすることができます。線に沿って何か:
# First parameter: ip
# Second parameter the list of ranges in a tuple
# Third parameter the passed list, i.e. the ranges it does match
# It return the list of range(s) that the ip matched.
def ip_in_range(ip, [], match_list) do: match_list
def ip_in_range(ip, [{from_ip, to_ip} | rest], match_list) when ip > from_ip and ip < to_ip do: ip_in_range(ip, rest, [{from_ip, to_ip} | match_list])
def ip_in_range(ip, [{from_ip, to_ip} | rest], match_list) when ip < from_ip or ip > to_ip do: ip_in_range(ip, rest, match_list)
次にあなたがINETとそれをキックオフできます。例えばparse_address/1の結果、:
ranges = [{{49, 14, 0, 0}, {49, 14, 63, 255}}, ...]
ip_in_range({49, 14, 1, 2}, ranges, [])
あなたは、同じくらい好きなように、すなわちチェックを、これを成形することができそれがどれくらいの範囲に属するか。または、最初の範囲チェック成功時に終了することさえできます。
IPアドレスとIP範囲の元の形式は何ですか? – Pascal
これは文字列形式になります –
あなたが試したことをここに追加できますか? – matov