Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 6 Jun 2002 23:43:26 -0600 (MDT)
From:      Warren Block <wblock@wonkity.com>
To:        BSD Freak <bsd-freak@mbox.com.au>
Cc:        FreeBSD Questions <freebsd-questions@FreeBSD.ORG>
Subject:   Re: Converting decimal dotted subnet mask to CIDR in a script
Message-ID:  <Pine.BSF.4.21.0206062337160.76838-100000@wonkity.com>
In-Reply-To: <f9079af91739.f91739f9079a@mbox.com.au>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, 7 Jun 2002, BSD Freak wrote:

> I have a variable in a script we use
> 
> $MASK=255.255.255.0
> 
> Is there a utility or an easy way to process $MASK and get 
> 
> $MASKCIDR=24
> 
> the CIDR value of 255.255.255.0

Okay:

#!/usr/bin/perl -w
($byte1, $byte2, $byte3, $byte4) = split(/\./, $ARGV[0].".0.0.0.0");
$num = ($byte1 * 16777216) + ($byte2 * 65536) + ($byte3 * 256) + $byte4;
$bin = unpack("B*", pack("N", $num));
$count = ($bin =~ tr/1/1/);
print "$bin = $count bits\n";

The first line is fluff to allow command-line operation.  The second
line converts dotted quad to plain decimal.  The third line converts
decimal to a binary string.  Line four counts the set bits.

However, no test is made on the validity of the mask--the bits should be
contiguous from the left.  I'm pretty sure there's an easy regular
expression which would do that, but it's getting late.

-Warren Block * Rapid City, South Dakota USA




To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0206062337160.76838-100000>