Canonicalize CIDR: Difference between revisions
Content added Content deleted
(Removed a blank line before the Go etnry.) |
m (add cases which are accepted by Apache) |
||
Line 180: | Line 180: | ||
function canonCIDR(cidr::String) |
function canonCIDR(cidr::String) |
||
cidr = replace(cidr, r"\.(\.|\/)" => s".0\1") # handle .. |
|||
cidr = replace(cidr, r"\.(\.|\/)" => s".0\1") # handle ... |
|||
ip = split(cidr, "/") |
ip = split(cidr, "/") |
||
dig = length(ip) > 1 ? 2^(32 - parse( |
dig = length(ip) > 1 ? 2^(32 - parse(UInt8, ip[2])) : 1 |
||
ip4 = IPv4(UInt64(IPv4(ip[1])) & (0xffffffff - dig + 1)) |
ip4 = IPv4(UInt64(IPv4(ip[1])) & (0xffffffff - dig + 1)) |
||
return length(ip) == 1 ? "$ip4" : "$ip4/$(ip[2])" |
return length(ip) == 1 ? "$ip4" : "$ip4/$(ip[2])" |
||
Line 187: | Line 189: | ||
println(canonCIDR("87.70.141.1/22")) |
println(canonCIDR("87.70.141.1/22")) |
||
println(canonCIDR("100.68.0.18/18")) |
|||
println(canonCIDR("10.4.30.77/30")) |
|||
println(canonCIDR("110.200.21/4")) |
|||
println(canonCIDR("10..55/8")) |
|||
println(canonCIDR("10.../8")) |
|||
</lang>{{out}} |
|||
<pre> |
|||
using Sockets |
|||
function canonCIDR(cidr::String) |
|||
cidr = replace(cidr, r"\.(\.|\/)" => s".0\1") # handle .. |
|||
cidr = replace(cidr, r"\.(\.|\/)" => s".0\1") # handle ... |
|||
ip = split(cidr, "/") |
|||
dig = length(ip) > 1 ? 2^(32 - parse(UInt8, ip[2])) : 1 |
|||
ip4 = IPv4(UInt64(IPv4(ip[1])) & (0xffffffff - dig + 1)) |
|||
return length(ip) == 1 ? "$ip4" : "$ip4/$(ip[2])" |
|||
end |
|||
println(canonCIDR("87.70.141.1/22")) |
|||
println(canonCIDR("100.68.0.18/18")) |
|||
println(canonCIDR("10.4.30.77/30")) |
|||
println(canonCIDR("110.200.21/4")) |
|||
println(canonCIDR("10..55/8")) |
|||
println(canonCIDR("10.../8")) |
|||
</lang>{{out}} |
</lang>{{out}} |
||
<pre> |
<pre> |
||
87.70.140.0/22 |
87.70.140.0/22 |
||
100.68.0.0/18 |
|||
10.4.30.76/30 |
|||
96.0.0.0/4 |
|||
10.0.0.0/8 |
|||
10.0.0.0/8 |
|||
</pre> |
</pre> |
||