Oziam Posted November 8, 2010 Share Posted November 8, 2010 I have a simple script that converts an ip range to a readable ip address, e.g 2147483647 = 127.255.255.255 and it works fine up to this range, anything after this causes an incorrect ip address. e.g 2147483648 should be 128.0.0.0 but it outputs 128.0.0.255 and so all ip address after this are incorrect! code I am using is below; $rawip_from = '2147483648'; // raw to readable ip $w1 = (int)($rawip_from / 16777216) % 256; $x1 = (int)($rawip_from / 65536 ) % 256; $y1 = (int)($rawip_from / 256 ) % 256; $z1 = (int)($rawip_from ) % 256; $rawip_to = '2147549184'; // raw to readable ip $w2 = (int)($rawip_to / 16777216) % 256; $x2 = (int)($rawip_to / 65536 ) % 256; $y2 = (int)($rawip_to / 256 ) % 256; $z2 = (int)($rawip_to ) % 256; $ip_from = ($w1.'.'.$x1.'.'.$y1.'.'.$z1); $ip_to = ($w2.'.'.$x2.'.'.$y2.'.'.$z2); echo "Ip raw range: $rawip_from - $rawip_to<p>Ip range: $ip_from - $ip_to"; /* should output Ip raw range: 2147483648 - 2164260863 Ip range: 128.0.0.0 - 128.1.0.0 but it outputs 128.0.0.255 - 128.1.0.255 */ It always seems to add 255 to the last range instead of the correct value????? I heard there is a bug in php with integers > 2147483647 if anyone knows of a fix it would be great!! Thanks... Quote Link to comment Share on other sites More sharing options...
plznty Posted November 8, 2010 Share Posted November 8, 2010 That is Int's maximum value, I think you will need a different method to int. Quote Link to comment Share on other sites More sharing options...
Oziam Posted November 8, 2010 Author Share Posted November 8, 2010 I worked out a solution, I was playing around and stumbled across it, I don't know why it works but it does 100% of the time, I have tested it using all variations of ranges and it outputs the correct value every time! New code! $rawip_from = '3716537112'-0; // adding the -0 or +0 will return a negative value of 221.133.219.-232 // raw to readable ip $w1 = (int)($rawip_from / 16777216) % 256; $x1 = (int)($rawip_from / 65536 ) % 256; $y1 = (int)($rawip_from / 256 ) % 256; $z1 = (int)($rawip_from ) % 256; if($z1 < 0){$z1 = $z1 + 256;} // include this to convert $z1 to the correct value $rawip_to = '3716537215'-0; // this will return a negative value of 221.133.219.-129 // raw to readable ip $w2 = (int)($rawip_to / 16777216) % 256; $x2 = (int)($rawip_to / 65536 ) % 256; $y2 = (int)($rawip_to / 256 ) % 256; $z2 = (int)($rawip_to ) % 256; if($z2 < 0){$z2 = $z2 + 256;} // include this to convert $z2 to the correct value $ip_from = ($w1.'.'.$x1.'.'.$y1.'.'.$z1); $ip_to = ($w2.'.'.$x2.'.'.$y2.'.'.$z2); echo "Ip range: $ip_from - $ip_to"; // Output: Ip range: 221.133.219.24 - 221.133.219.127 which is correct :-) It would be nice to understand why it works but hey I am just greatful it does! Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.