Problems using bitwise &

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Philluminati

    Problems using bitwise &


    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=3388826225, subnet=42949672 80) returned is -906141072 --
    >
    <!-- sip F (ip=170419969,s ubnet=429496704 0) returned is 170419968 -->

    <!-- 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?
  • Alexey Kulentsov

    #2
    Re: Problems using bitwise &amp;

    Philluminati wrote:
    >
    $ip = $networkObjectR ow['sipv4addr'];
    $subnet = $networkObjectR ow['eipv4addr'];
    >
    //make php treats these likes numbers and not strings
    >
    $ip += (int)0;
    $subnet += (int)0;
    $ip = (int)$networkOb jectRow['sipv4addr'];
    $subnet = (int)$networkOb jectRow['eipv4addr'];

    >
    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=3388826225, subnet=42949672 80) returned is -906141072 --
    <!-- sip F (ip=170419969,s ubnet=429496704 0) returned is 170419968 -->
    >
    <!-- 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.
    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,$subne t,$ans);

    Comment

    Working...