Canonicalize CIDR: Difference between revisions

Added Go
(Added C solution)
(Added Go)
Line 112:
</pre>
 
 
=={{header|Go}}==
{{trans|Ruby}}
<lang go>package main
 
import (
"fmt"
"log"
"os"
"strconv"
"strings"
)
 
func check(err error) {
if err != nil {
log.Fatal(err)
}
}
 
func main() {
// canonicalize a CIDR block: make sure none of the host bits are set
var cidr string
if len(os.Args) > 1 {
cidr = os.Args[1]
} else {
log.Fatal("Please pass the CIDR to be canonicalized.")
}
 
// dotted-decimal / bits in network part
split := strings.Split(cidr, "/")
dotted := split[0]
size, err := strconv.Atoi(split[1])
check(err)
 
// get IP as binary string
var bin []string
for _, n := range strings.Split(dotted, ".") {
i, err := strconv.Atoi(n)
check(err)
bin = append(bin, fmt.Sprintf("%08b", i))
}
binary := strings.Join(bin, "")
 
// replace the host part with all zeros
binary = binary[0:size] + strings.Repeat("0", 32-size)
 
// convert back to dotted-decimal
var canon []string
for i := 0; i < len(binary); i += 8 {
num, err := strconv.ParseInt(binary[i:i+8], 2, 64)
check(err)
canon = append(canon, fmt.Sprintf("%d", num))
}
 
// and output
fmt.Printf("%s/%s\n", strings.Join(canon, "."), split[1])
}</lang>
 
{{out}}
<pre>
$ go run canonicalize_cidr.go 87.70.141.1/22
87.70.140.0/22
</pre>
 
=={{header|Julia}}==
9,490

edits