I'm trying to perform some basic mathematics on IP Addresses. IP's are
normally represented as 32 bit unsigned integers. However I am getting
strange results when using the operators in PHP.
If you run this is a mysql query browser: select (3388826209 &
4294867288) as val; it will tell you the correct answer is:
3388760128. This is the answer I want. My snippet of PHP code is here:
$ip = $networkObjectR ow['sipv4addr'];
$subnet = $networkObjectR ow['eipv4addr'];
//make php treats these likes numbers and not strings
$ip += (int)0;
$subnet += (int)0;
if ($ip == 0)
return "NOT SET";
$ans = $ip & $subnet; //Bitwise AND.
print("<!-- sip F (ip=$ip,subnet= $subnet) returned is
$ans -->\n");
return ($ans);
However my output is like this:
<!-- sip F (ip=170419457,s ubnet=429496704 0) returned is 170419456 -->
<!-- sip F (ip=170419457,s ubnet=429496704 0) returned is 170419456 -->
<!-- sip F (ip=3388826225, subnet=42949672 80) returned is -906141072 --
>
>
<!-- sip F (ip=170419969,s ubnet=429496704 0) returned is 170419968 -->
Where the IP starts 17... the answer is correct. When the value starts
3388 the value is wrong.
I guess this is because PHP is treating the number as a 64 bit one
rather than an unsigned 32 bit one but I'm not really sure. Can anyone
help please?
Comment