[perl] integer omzetten naar ip

Pagina: 1
Acties:

  • Daniel304
  • Registratie: December 2000
  • Laatst online: 14-08 14:02
Ik heb van een ip adres
80.61.120.44
een integer gemaakt om mee te kunnen vergelijken
8061120044
Perl:
1
2
      (@ip) = split ('\.', $var_iprange_array->{ip1});
      foreach $ip (@ip) { $ipadres .= sprintf("%.3d", $ip); }

nu komt het vervelende nu moet ik het weer omzetten naar een ip
en daar loop ik beetje vast... hij moet hem van achter splitten elke drie getallen
en dan de voorste nullen van elke drie getallen strippen daarna met een punt aan elkaar plakken... mijn begin is zoiets ja ik weet zo werkt het niet ;) :
Perl:
1
2
    (@test) = split ('\d{3}', $ipadres);
    foreach (#$test){$test}

  • avon
  • Registratie: November 2002
  • Laatst online: 27-06-2025
Je kan hem wel spliten in 3, maar dan zou je moeten checken of de . waarde kleiner
is dan 100 in het orgineel. Anders moet er een 0 voor of er 100 bij optellen.

[ Voor 8% gewijzigd door avon op 06-11-2003 10:11 ]

Gratis webwinkel beginnen? Met Onetoshop.com kunt u direct beginnen!


  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 20-08 15:44

LauPro

Prof Mierenneuke®

Is het niet beter om het IP-adres zo op te slaan: IP-adres = a.b.c.d en dan: (a * 256 ^ 3) + (b * 256 ^ 2) + (c * 256) + d = x

Dat is iig de officiële methode afaik.

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


  • avon
  • Registratie: November 2002
  • Laatst online: 27-06-2025
En reken hem nu nog maar is terug dan :)

Gratis webwinkel beginnen? Met Onetoshop.com kunt u direct beginnen!


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

AvOn schreef op 05 november 2003 @ 16:54:
En reken hem nu nog maar is terug dan :)
Eeh, dat is echt geen probleem hoor :D

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 20-08 15:44

LauPro

Prof Mierenneuke®

Ik kan even niks vinden qua reference van Perl, maar volgens mij zit er een dergelijke functie als 'ip2long' in (en dus ook andersom).

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


  • jvhaarst
  • Registratie: Maart 2000
  • Laatst online: 30-06 19:02

jvhaarst

Eendracht maakt macht

Hier staat hoe het moet :
http://www.devarticles.com/art/1/622
code:
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl -wT
#ip2long converts IP-quad to IP-decimal
my (@octets,$octet,$ip_number,$number_convert,$ip_address);
$ip_address = $ARGV[0];
chomp ($ip_address);
@octets = split(/./, $ip_address);
$ip_number = 0;
foreach $octet (@octets) {
    $ip_number <<= 8;
    $ip_number |= $octet;
}
print "\nThe IP Address $ip_address converts to the IP Number $ip_number.\n";

en
code:
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl -wT
#long2ip converts IP-decimal to IP-quad
my (@octets,$i,$ip_number,$ip_number_display,$number_convert,$ip_address);
$ip_number_display = $ip_number = $ARGV[0];
chomp($ip_number);
for($i = 3; $i >= 0; $i--) {
    $octets[$i] = ($ip_number & 0xFF);
    $ip_number >>= 8;
}
$ip_address = join('.', @octets);
print "\nThe IP Number $ip_number_display converts to the IP Address $ip_address.\n";

[ Voor 91% gewijzigd door jvhaarst op 05-11-2003 17:39 . Reden: code toegevoegd ]

If you don’t have enough time, stop watching TV.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
AvOn schreef op 05 november 2003 @ 16:54:
En reken hem nu nog maar is terug dan :)
Als je het op de manier doet zoals de topic starter kan je hem juist niet meer terug rekenen. Stel dat je IP adres 10.11.125.125 hebt. Dat wordt dus
1011125125
als je dat terug gaat rekenen kan dat onder andere worden
101.11.251.25
101.1.125.125

en nog meer mogelijkheden. Als je het op de manier van LauPro doet dan heb je een 32 bits getal die je op kan delen in 4 * 8 bits wat dus weer de 4 octets van je IP adres voorstellen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-08 00:10
En voor wat LauPro beschrijft kent Perl de pack en unpack functies.

Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
############################################################################
#
#   Name:    Ip2Integer
#
#   Purpose: Convert an IP address into an integer value
#
#   Inputs:  $ip - IP address
#
#   Returns: Integer value, dies in case of problems
#
############################################################################

sub Ip2Integer ($) {
    my $ip = shift;
    die "Invalid IP address: $ip"
    unless defined($ip) and $ip =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/;
    ($1 << 24) | ($2 << 16) | ($3 << 8) | $4;
}


############################################################################
#
#   Name:    Integer2Ip
#
#   Purpose: Convert an integer value into an dotted quad
#
#   Inputs:  $integer - Integer value
#
#   Returns: Dotted quad string, dies in case of problems
#
############################################################################

sub Integer2Ip ($) {
    my $integer = shift;
    my $four = $integer & 0xff;
    $integer >>= 8;
    my $three = $integer & 0xff;
    $integer >>= 8;
    my $two = $integer & 0xff;
    $integer >>= 8;
    my $one = $integer;
    "$one.$two.$three.$four";
}

#   Author: Jochen Wiedmann
#       Am Eisteich 9
#       72555 Metzingen
#       Germany

[ Voor 101% gewijzigd door Verwijderd op 06-11-2003 09:34 ]


  • Daniel304
  • Registratie: December 2000
  • Laatst online: 14-08 14:02
gjk4all
Dat is een erg handig script werkt perfect hier dank je !!!
Scheelt mij redelijk wat foreach loops ;)

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-08 00:10
Misschien mosterd na de maaltijd, maar zoals gezegd kan pack de bit wizardry voor je afhandelen:

Perl:
1
2
3
4
5
6
7
8
9
$ip1 = '1.2.3.4';

# IP-adres in string-vorm converteren naar integer
$int = unpack('I', pack('C4', split(/\./, $ip1)));

# IP-adres in integer-vorm converteren naar string
$ip2  = join('.', unpack('C4', pack('I', $int)));

print "$ip1 -> $int -> $ip2\n"
Pagina: 1