|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
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 = $networkObjectRow['sipv4addr']; $subnet = $networkObjectRow['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,subnet=4294967040) returned is 170419456 --> <!-- sip F (ip=170419457,subnet=4294967040) returned is 170419456 --> <!-- sip F (ip=3388826225,subnet=4294967280) returned is -906141072 -- > <!-- sip F (ip=3388826225,subnet=4294967280) returned is -906141072 -- > <!-- sip F (ip=170419969,subnet=4294967040) returned is 170419968 --> <!-- sip F (ip=170419969,subnet=4294967040) 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 please? |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
On Mar 28, 11:15 am, Philluminati <Phillip.Ross.Tay...@gmail.com>
wrote: > 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 = $networkObjectRow['sipv4addr']; > $subnet = $networkObjectRow['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,subnet=4294967040) returned is 170419456 --> > <!-- sip F (ip=170419457,subnet=4294967040) returned is 170419456 --> > <!-- sip F (ip=3388826225,subnet=4294967280) returned is -906141072 -- > > <!-- sip F (ip=3388826225,subnet=4294967280) returned is -906141072 -- > > <!-- sip F (ip=170419969,subnet=4294967040) returned is 170419968 --> > > <!-- sip F (ip=170419969,subnet=4294967040) 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 > please? My current very-hacky workaround is to do this: $res = mysql_query("SELECT $ip & $subnet;"); .... but as you can see it's bordering on "very wrong"! |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
Philluminati wrote:
> > $ip = $networkObjectRow['sipv4addr']; > $subnet = $networkObjectRow['eipv4addr']; > > //make php treats these likes numbers and not strings > > $ip += (int)0; > $subnet += (int)0; $ip = (int)$networkObjectRow['sipv4addr']; $subnet = (int)$networkObjectRow['eipv4addr']; > > print("<!-- sip F (ip=$ip,subnet=$subnet) returned is > $ans -->\n"); > return ($ans); > > However my output is like this: > > <!-- sip F (ip=170419457,subnet=4294967040) returned is 170419456 --> > <!-- sip F (ip=170419457,subnet=4294967040) returned is 170419456 --> > <!-- sip F (ip=3388826225,subnet=4294967280) returned is -906141072 -- > <!-- sip F (ip=3388826225,subnet=4294967280) returned is -906141072 -- > <!-- sip F (ip=170419969,subnet=4294967040) returned is 170419968 --> > > <!-- sip F (ip=170419969,subnet=4294967040) returned is 170419968 --> > > Where the IP starts 17... the answer is correct. When the value starts > 3388 the value is wrong. PHP _outputs_ it as signed integer. Try formatted output to clear this question: printf("<!-- sip F (ip=%08X,subnet=%08X) returned is %08X -->\n",$ip,$subnet,$ans); |
|
![]() |
| Outils de la discussion | |
|
|