28 lines
991 B
Text
28 lines
991 B
Text
ClearAll[CanonicalizeCIDR]
|
|
CanonicalizeCIDR[str_String] := Module[{i, ip, chop, keep, change},
|
|
If[StringMatchQ[str, "*.*.*.*/*"],
|
|
i = StringSplit[str, "." | "/"];
|
|
i = Interpreter["Integer"] /@ i;
|
|
If[MatchQ[i, {_Integer, _Integer, _Integer, _Integer, _Integer}],
|
|
If[AllTrue[i, Between[{0, 255}]],
|
|
{ip, {chop}} = TakeDrop[i, 4];
|
|
ip = Catenate[IntegerDigits[ip, 2, 8]];
|
|
{keep, change} = TakeDrop[ip, chop];
|
|
change = ConstantArray[0, Length[change]];
|
|
ip = Partition[Join[keep, change], 8];
|
|
ip = ToString[FromDigits[#, 2]] & /@ ip;
|
|
StringRiffle[ip, "."] <> "/" <> ToString[chop]
|
|
,
|
|
Failure["Invalid range of numbers", <|"Input" -> str|>]
|
|
]
|
|
,
|
|
Failure["Invalid format", <|"Input" -> str|>]
|
|
]
|
|
]
|
|
]
|
|
CanonicalizeCIDR["87.70.141.1/22"]
|
|
CanonicalizeCIDR["36.18.154.103/12"]
|
|
CanonicalizeCIDR["62.62.197.11/29"]
|
|
CanonicalizeCIDR["67.137.119.181/4"]
|
|
CanonicalizeCIDR["161.214.74.21/24"]
|
|
CanonicalizeCIDR["184.232.176.184/18"]
|