perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 31
Click for quality!




11.02.2012 / 12:53

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragWie Dezimaladressen aus DB in IP-Adressen umrechnen
Seitenanfang
Hallo Leute

ich hab mal wieder ein kleines Problemchen. Bei meinen Abfragen aus ner DB werden auch IP-Adressen mit ausgeben. Diese werden aber dezimal ausgegeben, um auch mal schnell ne IP-Range zu berechnen. Das sieht dann beispielsweise so aus -6484724. Diese Dezimalzahl würde der 192.168.6.6 entsprechen. Wie wandle ich solche Sachen um. Gibt es da irgendwelche Funktionen in Perl oder muss ich mir da selber was schreiben. Oder kann man das vielleicht direkt mit nem SQL-Befehl noch hinbekommen.

Tschau

Datum: 25.07.2006-09:24

Beitragre: Wie Dezimaladressen aus DB in IP-Adressen umrechnen
Seitenanfang
Hallo

ich formuliere meine Frage mal um. Gibt es in Perl schon eine fertige Funktion, welche eine Dezimalzahl in eine Hexadezimalzahl umwandelt.Ich habe nämlich jetzt mitbekommen, dass die Dezimalzahl in eine Hexadezimalzahl umgewandelt wird und dann immer 4 Byte zu einem Block wieder in Dezimal umgerechnet werden.

Tschau

Datum: 26.07.2006-14:31

Beitragre: Wie Dezimaladressen aus DB in IP-Adressen umrechnen
Seitenanfang
Hallo

also wenn ich "nur" Dezimalzahlen in Hexadezimalzahlen umwandeln wollen würde, dann wäre mein Problemchen schon gelöst. Dazu könnte man die formatierte Ausgabe verwenden. Sie hier :

#!/usr/bin/perl

print "\n------------------------------------------------\n";
print "Umrechnung Dezimal zu IP\n";
print "------------------------------------------------\n\n";
print "Geben Sie einen Wert ein :\t";
$a = <STDIN>;
print "\n------------------------------------------------\n";
printf "Ausgabe :\t%x",$a;
print "\n------------------------------------------------\n";

Ich will ja aber damit noch mehr machen. Deshalb muss ich wohl doch etwas selber zusammenbasteln. Denn es soll wie folgt ablaufen :

1. Eingabe einer Dezimalzahl zum Beispiel -1046576623
2. Umwandlung dieser Dezimalzahl in Hexadezimal -> Ergebnis wäre : C1 9E 82 11
3. Jeden Block hernehmen und wieder in Dezimal zurückwandeln und anschließend durch Punkte (Dots) trennen -> Ergebnis wäre : 193.158.130.17

Nun meine Frage dazu : Wie mache ich das am elegantesten mit Perl ? Ich hoffe hier kann mir jemand helfen !

Tschau

Datum: 26.07.2006-15:07

Beitragre: Wie Dezimaladressen aus DB in IP-Adressen umrechnen
Seitenanfang
hallo,

wie wärs mit sprintf() anstatt printf()?

also dann so:

$testVar = sprintf "%x",$a;

mfG,
steckl

Datum: 26.07.2006-17:04

Beitragre: Wie Dezimaladressen aus DB in IP-Adressen umrechnen
Seitenanfang
Hallo

dankeschön für die Antwort, aber wie mache ich es dann, dass der Wert der beispielsweise in $testVar steht umgewandelt wird von C19E8211 in 193.158.130.17? Soll heissen wie gebe ich Perl zu verstehen, dass es C1 zurück nach 193 wandelt, dann einen Punkt setzt und dann das Gleiche mit 9E, 82 , 11 macht und da dazwischen jeweils nen Punkt setzt.

Tschau

Datum: 27.07.2006-13:19

Beitragre: Wie Dezimaladressen aus DB in IP-Adressen umrechnen
Seitenanfang
hallo,

damit kannst du den string in 4 teile aufteilen (geht aber nur wenn er 8 stellen hat):


my @stellen;
for(my $i=0; $i<8; $i=$i+2)
{
$stellen[$i] = substr($testvar,$i,2);
}

danach kannst die einzelnen elemente der liste wieder in dezimalzahlen umwandeln. und dann mit join zu einem string mit '.' als trennzeichen zusammenfügen:


my $ipAdress = join(".",@stellen);

hoffe ich hab dein problem richtig verstanden

mfG,
stefan

Datum: 27.07.2006-14:59

Beitragre: Wie Dezimaladressen aus DB in IP-Adressen umrechnen
Seitenanfang
Servus,

such mal bei Google nach der Perl-Funktion "pack".
Oder schau mal im Modul "socket".
Da sollte was passendes dabei sein.

Gruesse

Datum: 28.07.2006-09:05

Beitragre: Wie Dezimaladressen aus DB in IP-Adressen umrechnen
Seitenanfang
@ steckl :

Ich hab mir das mal angeschaut. Bei deinem Code kommt dann als Ergebnis C1..9E..82..11 und das ist nicht so ganz was ich will. Also hab ich den Code mal etwas modifiziert.


#!/usr/bin/perl

print "\n------------------------------------------------\n";
print "Umrechnung Dezimal zu IP\n";
print "------------------------------------------------\n\n";
print "Geben Sie einen Wert ein :\t";
$a = <STDIN>;
$b = sprintf "%x",$a;

$ca = substr($b,0,2);
$cb = substr($b,2,2);
$cc = substr($b,4,2);
$cd = substr($b,6,2);

@stellen=($ca,$cb,$cc,$cd);

my $ipAdress = join(".",@stellen);
print "\n------------------------------------------------\n";
print "Ausgabe :\t",$ipAdress;
print "\n------------------------------------------------\n";

Er gibt mir jetzt als Ergebnis schon C1.9E.82.11 aus. Damit sind wir zwar schon ein Stück weiter aber noch nicht am Ziel, denn er soll ja 193.158.130.17 als ERgebnis raushauen. Es fehlt quasi noch die Rückwandlung der einzelnen Blöcke von Heaxdezimal in Dezimal. Leider gibt es da von der formatierten Ausgabe keine Lösung so nach dem Schema $classa = sprintf "%dez",$ca; Wie könnte man also die Rückwandlung zu Dezimal machen ? Aber erstmal dankeschön für die Antworten.

@spline :

Ich schaue mir das mal noch an und melde mich dazu nochmal. Aber erstmal dankeschön für die Antworten.

Datum: 28.07.2006-11:17

Beitragre: Wie Dezimaladressen aus DB in IP-Adressen umrechnen
Seitenanfang
hi,

die umwandlung von dezimal in hex und umgekehrt geth (wie spline schon geschrieben hat) mit pack(). du musst dann einfach die einzelnen listenelemente vor dem join() mit pack() umwandeln. damit könntest auch das sprintf ersetzen.

sg,
steckl

Datum: 28.07.2006-13:59

Beitragre: Wie Dezimaladressen aus DB in IP-Adressen umrechnen
Seitenanfang
Hallo,

also ich habe mir die Funktion pack jetzt mal etwas näher angeschaut. Hier mal eigentlich etwas ganz einfaches :

#!/usr/bin/perl

$test = pack ("H",-1046576623);

print "Ausgabe:\t",$test;

Wenn ich das richtig verstanden habe, dann erzeuge ich mit h oder H einen Hex-String und mit i oder I einen Dezimal-String. Wenn ich also oben die Funktion pack anwende mit -1046576623 müsste er mir ja eigentlich C19E8211 als hex zurück geben. Das funktioniert irgendwie noch nicht. Was mache ich da noch falsch?

Datum: 31.07.2006-10:34

Beitragre: Wie Dezimaladressen aus DB in IP-Adressen umrechnen
Seitenanfang
Hallo,

also ich habe das Problem jetzt erstmal anders gelöst, aber wie gesagt wie das mit pack funktioniert würde mich trotzdem mal noch interessieren. Hier erstmal meine jetzige Lösung des Problem :

#!/usr/bin/perl

print "\n------------------------------------------------\n";
print "Umrechnung Dezimal zu IP\n";
print "------------------------------------------------\n\n";
print "Geben Sie einen Wert ein :\t";
$a = <STDIN>;
$b = sprintf "%x",$a;

$tempa = substr($b,0,2);
$tempb = substr($b,2,2);
$tempc = substr($b,4,2);
$tempd = substr($b,6,2);

$ca = hex($tempa);
$cb = hex($tempb);
$cc = hex($tempc);
$cd = hex($tempd);

@stellen=($ca,$cb,$cc,$cd);

my $ipAdress = join(".",@stellen);
print "\n------------------------------------------------\n";
print "Ausgabe :\t",$ipAdress;
print "\n------------------------------------------------\n";

Dies ist aber nur ein Teil meines Problems denn wir jetzt gelöst gemeinsam gelöst haben. Denn eigentlich sieht die Angelegenheit so aus. Ich mache mit Perl eine Abfrage auf eine DB2 Datenbank über MySQL. Dies funktioniert auch einwnadfrei. Die Rückgabewerte werden in einem Array abgespeichert. Der Quellcode dazu sieht so aus :

$sth = $dbh->prepare("SELECT DISTINCT  BLA BLA BLA");
$sth->execute();

printf DATEI1 "%-22s%-11s%-12s%-14s%-14s%-12s%-22s%-20s",@Kopfzeile2;
printf DATEI1 "\n\n";

while ((@row) = $sth->fetchrow_array)
{
printf DATEI1 "%-22s%-11s%-12s%-14s%-14s%-12s%-22s%-20s",@row;
printf DATEI1 "\n";

Wie kann ich jetzt am Besten auf einen einzelnen Wert innerhalb des Arrays zugreifen. Denn beispielsweise der fünfte Wert in diesem Array soll durch die Unterfunktion von Dezimal in IP-Adresse umgerechnet werden.

Tschau

Datum: 31.07.2006-11:17

Beitragre: Wie Dezimaladressen aus DB in IP-Adressen umrechnen
Seitenanfang
hi,

auf die einzelnen elemente eines arrays kannst du ueber den index zugreifen. das erste Element hat den index 0, das letzte den index $#arrayName (=anzahl der elemente - 1).

wenn du beispielsweise das fuenfte Element haben willst schreibst du:

my $fuenftesElement = $arrayName[4];

mfG, steckl

Datum: 31.07.2006-12:46

Beitragre: Wie Dezimaladressen aus DB in IP-Adressen umrechnen
Seitenanfang
Hallo steckl,

also nochmal dankeschön für deinen Denkanstoss. Hab diesen etwas modifiziert und jetzt funktioniert alles so wie ich es will.Jetzt muss ich das Ganze nur noch in eine Unterfunktion packen, da ich das IP-Umrechnen für verschiedene Tabellen brauche.

Also Thanks

Datum: 31.07.2006-13:36

Beitragre: Wie Dezimaladressen aus DB in IP-Adressen umrechnen
Seitenanfang
So, hier noch was Google dazu gefunden hat:
http://rolfrost.de/bitops.html
http://de.selfhtml.org/perl/funktionen/zeichenketten.htm
http://dungeon-bbs.homeip.net/forum/viewtopic.php?p=3656 (ein bisserl runterscrollen, da ist dann ne Formel)

Ich würde auch ml in der MySQL-Doku nachschauen, ob es für IP-Adressen nicht sogar einen eigene Datentypen gibt. Dann kannst Du Dir das rumgerechne sparen. Oder kannst notfalls die DB die berechnung machen lassen.

Gruesse

spline

Datum: 01.08.2006-23:16

-






-
-