http://qs321.pair.com?node_id=59107


in reply to BigInt usage

That would be true if you used signed integers. For unsigned integers, you will be fine. Even if you needed a few more bytes, Perl uses doubles so you can accurately deal with integers of about 56-bits each.

        - tye (but my friends call me "Tye")

Replies are listed 'Best First'.
Re: (tye)Re: BigInt usage
by ryan (Pilgrim) on Feb 17, 2001 at 12:56 UTC
    Sounds fair to me, so I tried it - am I correct in using "L" instead of "N" in the unpack?

    my @range = map { unpack "L", pack "C4", split /\./ } qw(10.0.0.0 10.1 +.0.0); print "@range\n"; # the numbers themselves print $range[1]-$range[0]+1, "\n"; # how many addresses for ($range[0]..$range[1]) { print join(".", unpack "C4", pack "N", $_), "\n"; }

    When i do the above it reverses the input to 0.0.0.10 -> 0.0.1.10 I can fix this up I guess, but why is it doing that?

    Am I using the wrong unpack data type?

      After some stuffing around I came up with a solution:

      The large integers are never a problem until the 'for' loop, so I just used the ACTUAL host count instead of the numbers representing each address, then added the original address representation that was subtracted when it is joined.

      I have limited the width of the range regardless because what I am doing with the IPs is fruitless when there are more than 1 million. So BigInt is useless anyway.

      my @range = map { unpack "N", pack "C4", split /\./ } $ARGV[0], $ARGV[ +1]; for (0..$range[1]-$range[0]) { print join(".", unpack "C4", pack "N", $_+$range[0]), "\n"; }
      I can't fault the code now, does exactly what I want in every case.

      Thanks.