Re: Check if ip is with a network block

From: Date: Thu, 15 Nov 2001 17:06:45 +0000
Subject: Re: Check if ip is with a network block
References: 1  Groups: php.general 
Request: Send a blank email to php-general+get-74742@lists.php.net to get a copy of this message
Paul Wolstenholme wrote: > Greetings, > > I'd like to check to see if an ip is within an ip cidr style network > block (192.75.242.157 with 192.75.242.0/23). Initially, I started off > with some code derived from some perl code that I found (code below). > However, the bitmask calcution did not work ( $bitmask = 0xffffffff << > (32 - $nbits);) and the hexdec did not appear to support values as bit > as 0xffffffff. > ip = -1068764584 > start = -1068764672 > mask = -16777216 Okay, basically what's going on is that PHP is using SIGNED integers, and that's messing you up, almost for sure. Since your actual problem is to work with 3/4ths of the IP that has to match exactly, and only the last section needs the bit-math, what *I* would do is to http://php.net/explode the IPs, and do the bit-shifting on the 4th byte, and use == on the other 3 bytes. You then do not need to worry about signed/unsigned integers and wrap-around arithmetic. PHP's bit-shift operators *DO* work properly, and if you interpret the negative numbers correctly, they *ARE* the right bits for an unsigned integer, but that's too hard for my poor little brain, and doing it with explode and bit-shifting on the last byte is far more understandable. -- Like music? http://l-i-e.com/artists.htm

« previous php.general (#74742) next »