/* Print address, mask, network, and broadcast in binary * Copyright 2021 Tj * Licensed on the terms of the GNU General Public Licence version 3 * * Compile: gcc -o ipv4_net ipv4_net.c -lm * Usage: ipv4_net * Example: * ./ipv4_net 10.1.2.5 30 * Prefix: 0x0000001e 30 * Mask: 0xfffffffc 11111111111111111111111111111100 * Address: 0x0a010205 00001010000000010000001000000101 10.1.2.5 * Network: 0x0a010204 00001010000000010000001000000100 * Broadcast: 0x0a010207 00001010000000010000001000000111 * */ #include #include #include #include static char * print_binary(unsigned int num, char *buf) { int i; for(i=31; i >= 0; --i) { unsigned int b = (num & ((unsigned int)pow(2, i))) > 0; sprintf(&buf[31-i], "%d", b); } buf[32-i] = '\0'; return buf; } int main(int argc, char**argv, char **env) { unsigned int networkbyteorder = 0; unsigned int address = 0; unsigned int prefix = atoi(argv[2]); unsigned int mask = (unsigned int) ~ (0xffffffffUL >> prefix); unsigned int network = 0; unsigned int broadcast = 0; unsigned char buffer[38]; inet_pton(AF_INET, argv[1], &networkbyteorder); address = ntohl(networkbyteorder); network = address & mask; broadcast = (0xffffffff >> prefix) | (address & mask);; printf("Prefix:\t\t0x%08x\t%d\n", prefix, prefix); printf("Mask:\t\t0x%08x\t%s\n", mask, print_binary(mask, buffer)); printf("Address:\t0x%08x\t%s\t%s\n", address, print_binary(address, buffer), argv[1]); printf("Network:\t0x%08x\t%s\n", network, print_binary(network, buffer)); printf("Broadcast:\t0x%08x\t%s\n", broadcast, print_binary(broadcast, buffer)); return 0; }