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(UInt64, ip[2])) : 1
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>