Re: [PHP] Failure in bitwise operations moving from 5.2.x to 5.3.x
You might want to take a look at the BC Math functions, which can perform operations on arbitrary length numbers. On Tue, Mar 15, 2011 at 12:31 PM, Ford, Mike wrote: >> -Original Message- >> From: Andy McKenzie [mailto:amckenz...@gmail.com] >> Sent: 15 March 2011 15:51 >> >> As it turns out, the most important lesson here is: "Don't trust >> what >> anyone tells you." The old server is 64-bit. The new server is >> 32-bit. Once I stopped to check that myself, it all became clear. >> For the archives, here's what happened. >> >> Everything worked fine until I ran bindec() on the binary netmask; >> at >> that point it returned a float rather than an int, as it it used to. >> Therefore, when I ran ip2long on the result, it choked, and returned >> bool(false). Which isn't really useful when you're trying to >> produce >> a human-readable netmask, when you get right down to it. >> >> I still don't have a solution that will work on a 32-bit server, but >> now that I know what's going on, I should be able to either find >> something that will work, or get things moved to a 64-bit machine. > > You may have to use a replacement for bindec which employs bit-shifting > to get the result you want; something like: > > function my_bindec($binstr) > { > $binlen = strlen($binstr); > $decval = 0; > for ($i=0; $i<$binlen; ++$i): > $decval = ($decval<<1) | ($binstr[$i]?1:0); > endfor; > > return $decval; > } > > Note: off the top of my head and completely UNTESTED! > > Also, the constant 4294967295 quoted in your original message will > become a float value on a 32-bit system. It's actually a representation > of 32-bit -1, so either write it like that or use something like > ip2long('255.255.255.255') (or > my_bindec('')!!!). > > > Cheers! > > Mike > > -- > Mike Ford, > Electronic Information Developer, Libraries and Learning Innovation, > Leeds Metropolitan University, C507 City Campus, > Woodhouse Lane, LEEDS, LS1 3HE, United Kingdom > Email: m.f...@leedsmet.ac.uk > Tel: +44 113 812 4730 > > > > > To view the terms under which this email is distributed, please go to > http://disclaimer.leedsmet.ac.uk/email.htm > > -- > PHP General Mailing List (http://www.php.net/) > To unsubscribe, visit: http://www.php.net/unsub.php > > -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
RE: [PHP] Failure in bitwise operations moving from 5.2.x to 5.3.x
> -Original Message- > From: Andy McKenzie [mailto:amckenz...@gmail.com] > Sent: 15 March 2011 15:51 > > As it turns out, the most important lesson here is: "Don't trust > what > anyone tells you." The old server is 64-bit. The new server is > 32-bit. Once I stopped to check that myself, it all became clear. > For the archives, here's what happened. > > Everything worked fine until I ran bindec() on the binary netmask; > at > that point it returned a float rather than an int, as it it used to. > Therefore, when I ran ip2long on the result, it choked, and returned > bool(false). Which isn't really useful when you're trying to > produce > a human-readable netmask, when you get right down to it. > > I still don't have a solution that will work on a 32-bit server, but > now that I know what's going on, I should be able to either find > something that will work, or get things moved to a 64-bit machine. You may have to use a replacement for bindec which employs bit-shifting to get the result you want; something like: function my_bindec($binstr) { $binlen = strlen($binstr); $decval = 0; for ($i=0; $i<$binlen; ++$i): $decval = ($decval<<1) | ($binstr[$i]?1:0); endfor; return $decval; } Note: off the top of my head and completely UNTESTED! Also, the constant 4294967295 quoted in your original message will become a float value on a 32-bit system. It's actually a representation of 32-bit -1, so either write it like that or use something like ip2long('255.255.255.255') (or my_bindec('')!!!). Cheers! Mike -- Mike Ford, Electronic Information Developer, Libraries and Learning Innovation, Leeds Metropolitan University, C507 City Campus, Woodhouse Lane, LEEDS, LS1 3HE, United Kingdom Email: m.f...@leedsmet.ac.uk Tel: +44 113 812 4730 To view the terms under which this email is distributed, please go to http://disclaimer.leedsmet.ac.uk/email.htm -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] Failure in bitwise operations moving from 5.2.x to 5.3.x
On Tue, Mar 15, 2011 at 12:26, Adam Richardson wrote: > > Hah! > > This was the list with the Alex. Too many lists, too few neurons. In the Facebook age, email really needs some sort of "I Agree" button. I'm right-on with you on that one, Adam. -- Network Infrastructure Manager http://www.php.net/ -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] Failure in bitwise operations moving from 5.2.x to 5.3.x
On Tue, Mar 15, 2011 at 12:21 PM, Daniel Brown wrote: > On Tue, Mar 15, 2011 at 12:18, Adam Richardson > wrote: > > > > My apologies: > > > > Nice detective work ANDY (sorry, Andy, see earlier note about my shabby > > memory.) I'd just replied to an Alex on another list. > > > > Sorry. > > Don't be. He signs his emails as "Alex." I had to do a > double-take before, too. ;-P > > -- > > Network Infrastructure Manager > http://www.php.net/ > Hah! This was the list with the Alex. Too many lists, too few neurons. Adam -- Nephtali: A simple, flexible, fast, and security-focused PHP framework http://nephtaliproject.com
Re: [PHP] Failure in bitwise operations moving from 5.2.x to 5.3.x
On Tue, Mar 15, 2011 at 12:18, Adam Richardson wrote: > > My apologies: > > Nice detective work ANDY (sorry, Andy, see earlier note about my shabby > memory.) I'd just replied to an Alex on another list. > > Sorry. Don't be. He signs his emails as "Alex." I had to do a double-take before, too. ;-P -- Network Infrastructure Manager http://www.php.net/ -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] Failure in bitwise operations moving from 5.2.x to 5.3.x
On Tue, Mar 15, 2011 at 12:15 PM, Adam Richardson wrote: > On Tue, Mar 15, 2011 at 11:50 AM, Andy McKenzie wrote: > >> > Now: I did a little more looking around this morning, and it looks >> > like I may well run into problems here given that I'm moving from a >> > 32-bit architecture to a 64-bit architecture. Bitwise math is still >> > fairly obscure to me, so it's likely that I'm overlooking something >> > obvious, but maybe instead of asking "How do I fix this?" I should be >> > asking "What would the right way to do this have been?" As I think I >> > said before, I didn't actually write most of this code, I inherited >> > it, and as long as the input and output of the class remain the same, >> > I don't actually care how the work is done. >> > >> > >> > If anyone has any useful input here, I'd appreciate it! >> > >> > -Alex >> > >> >> As it turns out, the most important lesson here is: "Don't trust what >> anyone tells you." The old server is 64-bit. The new server is >> 32-bit. Once I stopped to check that myself, it all became clear. >> For the archives, here's what happened. >> >> Everything worked fine until I ran bindec() on the binary netmask; at >> that point it returned a float rather than an int, as it it used to. >> Therefore, when I ran ip2long on the result, it choked, and returned >> bool(false). Which isn't really useful when you're trying to produce >> a human-readable netmask, when you get right down to it. >> >> I still don't have a solution that will work on a 32-bit server, but >> now that I know what's going on, I should be able to either find >> something that will work, or get things moved to a 64-bit machine. >> >> >> -Alex >> >> -- >> PHP General Mailing List (http://www.php.net/) >> To unsubscribe, visit: http://www.php.net/unsub.php >> >> > Nice detective work, Alex. > > Thanks for posting this info back to the list. I'm sure some tired-eyed > developer some time in the future will benefit from having this information > available in the list archives (it might even be me once my shabby memory > has lost the index for this valuable info.) > > Adam > > -- > Nephtali: A simple, flexible, fast, and security-focused PHP framework > http://nephtaliproject.com > My apologies: Nice detective work ANDY (sorry, Andy, see earlier note about my shabby memory.) I'd just replied to an Alex on another list. Sorry. Adam -- Nephtali: A simple, flexible, fast, and security-focused PHP framework http://nephtaliproject.com
Re: [PHP] Failure in bitwise operations moving from 5.2.x to 5.3.x
On Tue, Mar 15, 2011 at 11:50 AM, Andy McKenzie wrote: > > Now: I did a little more looking around this morning, and it looks > > like I may well run into problems here given that I'm moving from a > > 32-bit architecture to a 64-bit architecture. Bitwise math is still > > fairly obscure to me, so it's likely that I'm overlooking something > > obvious, but maybe instead of asking "How do I fix this?" I should be > > asking "What would the right way to do this have been?" As I think I > > said before, I didn't actually write most of this code, I inherited > > it, and as long as the input and output of the class remain the same, > > I don't actually care how the work is done. > > > > > > If anyone has any useful input here, I'd appreciate it! > > > > -Alex > > > > As it turns out, the most important lesson here is: "Don't trust what > anyone tells you." The old server is 64-bit. The new server is > 32-bit. Once I stopped to check that myself, it all became clear. > For the archives, here's what happened. > > Everything worked fine until I ran bindec() on the binary netmask; at > that point it returned a float rather than an int, as it it used to. > Therefore, when I ran ip2long on the result, it choked, and returned > bool(false). Which isn't really useful when you're trying to produce > a human-readable netmask, when you get right down to it. > > I still don't have a solution that will work on a 32-bit server, but > now that I know what's going on, I should be able to either find > something that will work, or get things moved to a 64-bit machine. > > > -Alex > > -- > PHP General Mailing List (http://www.php.net/) > To unsubscribe, visit: http://www.php.net/unsub.php > > Nice detective work, Alex. Thanks for posting this info back to the list. I'm sure some tired-eyed developer some time in the future will benefit from having this information available in the list archives (it might even be me once my shabby memory has lost the index for this valuable info.) Adam -- Nephtali: A simple, flexible, fast, and security-focused PHP framework http://nephtaliproject.com
Re: [PHP] Failure in bitwise operations moving from 5.2.x to 5.3.x
> Now: I did a little more looking around this morning, and it looks > like I may well run into problems here given that I'm moving from a > 32-bit architecture to a 64-bit architecture. Bitwise math is still > fairly obscure to me, so it's likely that I'm overlooking something > obvious, but maybe instead of asking "How do I fix this?" I should be > asking "What would the right way to do this have been?" As I think I > said before, I didn't actually write most of this code, I inherited > it, and as long as the input and output of the class remain the same, > I don't actually care how the work is done. > > > If anyone has any useful input here, I'd appreciate it! > > -Alex > As it turns out, the most important lesson here is: "Don't trust what anyone tells you." The old server is 64-bit. The new server is 32-bit. Once I stopped to check that myself, it all became clear. For the archives, here's what happened. Everything worked fine until I ran bindec() on the binary netmask; at that point it returned a float rather than an int, as it it used to. Therefore, when I ran ip2long on the result, it choked, and returned bool(false). Which isn't really useful when you're trying to produce a human-readable netmask, when you get right down to it. I still don't have a solution that will work on a 32-bit server, but now that I know what's going on, I should be able to either find something that will work, or get things moved to a 64-bit machine. -Alex -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] Failure in bitwise operations moving from 5.2.x to 5.3.x
On Tue, Mar 15, 2011 at 8:07 AM, Andy McKenzie wrote: > On Mon, Mar 14, 2011 at 11:39 PM, Adam Richardson > wrote: >>> >>> This one's got me stumped. I >>> have the following line in a script: >>> >>> $this->bc = ($this->network | (~$this->netmask)) & 4294967295; >>> >>> $this->network and $this->netmask should both be of type long, and I >>> should wind up with another long. I didn't write the original method, >>> and I can't remember what "bc" stands for at the moment, but it's part >>> of a tool for working out first and last IP address, netmask, and a >>> few other things from a subnet definition. >>> >>> On the old system, it works fine. On the new system, I get the following >>> error: >>> >>> "PHP Fatal error: Unsupported operand types in >>> /var/www/test/common_subnet.inc on line 39" >>> >> >> Have you checked the types being operated on? I'm wondering if somehow one >> of the object properties you're operating on has changed has changed in >> terms of type. >> >> I'd try var_dumping each of the properties ($this->network and >> $this->netmask) the line above just to make sure they didn't somehow get >> switched to a type that bitwise operators complain about (array, Object.) >> >> Adam >> >> -- >> Nephtali: A simple, flexible, fast, and security-focused PHP framework >> http://nephtaliproject.com >> > > I'll check when I get back to work, but I doubt that's it: the last > time either is touched, it's being converted from an network address > or netmask to a long, using ip2long. I would assume that if there was > a problem with that, it would show up there, not when it got further > down. I'll check the values, though, as I say... I hadn't really > considered that something might be failing silently earlier on. > > -Alex > And, as Adam suggested, the problem is in fact with the input values. On the old system, those variables have the following values: this->network: int(168566272) this->netmask: int(4294966784) On the new system, they return: this->network: int(0) this->netmask: bool(false) Clearly there's a problem there. Here's the code that generates those values: class subnet { # Begin class subnet private $cidr; # The CIDR format network definition private $ip_array; # An array with the IP and the CIDR netmask private $ip;# The IP, as a decimal private $netmask; # The binary netmask private $network; # The network number private $bc;# beats me, but it's used all over the place. public function __construct($cidr) { # Begin __construct $this->cidr = $cidr; $this->ip_array = explode('/', $this->cidr); for($i = 1; $i <= 32; $i++) { $this->bin .= $this->ip_array[1] >= $i ? '1' : '0'; } $this->ip_array[1] = bindec($this->bin); $this->netmask = ip2long($this->ip_array[1]); $this->network = ($this->ip & $this->netmask); $this->bc = ($this->network | (~$this->netmask)) & 4294967295; } # End __construct >From there it goes on to give me functions to return the first, last, and total number of IPs in the range, the netmask, and so on. They can all be returned as either a standard ip (1.2.3.4) or a long int. Now: I did a little more looking around this morning, and it looks like I may well run into problems here given that I'm moving from a 32-bit architecture to a 64-bit architecture. Bitwise math is still fairly obscure to me, so it's likely that I'm overlooking something obvious, but maybe instead of asking "How do I fix this?" I should be asking "What would the right way to do this have been?" As I think I said before, I didn't actually write most of this code, I inherited it, and as long as the input and output of the class remain the same, I don't actually care how the work is done. If anyone has any useful input here, I'd appreciate it! -Alex -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] Failure in bitwise operations moving from 5.2.x to 5.3.x
On Mon, Mar 14, 2011 at 11:39 PM, Adam Richardson wrote: >> >> This one's got me stumped. I >> have the following line in a script: >> >> $this->bc = ($this->network | (~$this->netmask)) & 4294967295; >> >> $this->network and $this->netmask should both be of type long, and I >> should wind up with another long. I didn't write the original method, >> and I can't remember what "bc" stands for at the moment, but it's part >> of a tool for working out first and last IP address, netmask, and a >> few other things from a subnet definition. >> >> On the old system, it works fine. On the new system, I get the following >> error: >> >> "PHP Fatal error: Unsupported operand types in >> /var/www/test/common_subnet.inc on line 39" >> > > Have you checked the types being operated on? I'm wondering if somehow one > of the object properties you're operating on has changed has changed in > terms of type. > > I'd try var_dumping each of the properties ($this->network and > $this->netmask) the line above just to make sure they didn't somehow get > switched to a type that bitwise operators complain about (array, Object.) > > Adam > > -- > Nephtali: A simple, flexible, fast, and security-focused PHP framework > http://nephtaliproject.com > I'll check when I get back to work, but I doubt that's it: the last time either is touched, it's being converted from an network address or netmask to a long, using ip2long. I would assume that if there was a problem with that, it would show up there, not when it got further down. I'll check the values, though, as I say... I hadn't really considered that something might be failing silently earlier on. -Alex -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] Failure in bitwise operations moving from 5.2.x to 5.3.x
> > This one's got me stumped. I > have the following line in a script: > > $this->bc = ($this->network | (~$this->netmask)) & 4294967295; > > $this->network and $this->netmask should both be of type long, and I > should wind up with another long. I didn't write the original method, > and I can't remember what "bc" stands for at the moment, but it's part > of a tool for working out first and last IP address, netmask, and a > few other things from a subnet definition. > > On the old system, it works fine. On the new system, I get the following > error: > > "PHP Fatal error: Unsupported operand types in > /var/www/test/common_subnet.inc on line 39" > Have you checked the types being operated on? I'm wondering if somehow one of the object properties you're operating on has changed has changed in terms of type. I'd try var_dumping each of the properties ($this->network and $this->netmask) the line above just to make sure they didn't somehow get switched to a type that bitwise operators complain about (array, Object.) Adam -- Nephtali: A simple, flexible, fast, and security-focused PHP framework http://nephtaliproject.com