* Joachim Ziegler wrote/schrieb:

> das geht sehr einfach mit dem "Horner-Schema", dem schnellsten algorithmus, 
> ein polynom auszuwerten (hey, ein algorithmus!): betrachte $ip als polynom 
> zur basis 256, die einzelnen bytes sind dann die koeffizienten:
> 
> --------- wandler.pl -------------------------
> $ip        = q/192.168.1.1/;
> @array     = split /\./, $ip;  # wie von soeren
> 
> $dec=0;
> 
> for($i=0;$i<@array;$i++) {
>   $dec = ($dec*256) + $array[$i];
> }
> 
> print $dec;
> -------------------------------------------------
> 
> ausgabe: 3232235777

Sehr sch�n, danke. :-) Ich habe das mal f�r mein Progr�mmchen an meinen
schlechten Programmierstil angepa�t:

foreach(split /\./, $ip){
        $dec=($dec <<8) + $_;
}

> der umgekehrte weg: division mit rest anwenden, d.h. in jeder iteration modulo 
> 256 rechnen. das ergibt die jeweils n�chste ziffer von hinten (in 
> 256-adischer darstellung). ziffern sammen und umgekehrt ausgeben (in hex).
> 
> -------------wandler2.pl------------------
> $dec=3232235777;
> 
> while($dec!=0) {
>   $letzte_ziffer = $dec % 256;
>   push @tmp,$letzte_ziffer;
>   $dec = int($dec / 256); # letzte ziffer abschneiden
> }
> 
> for($i=@tmp-1;$i>=0;$i--) { # r�ckw�rts ausgeben
>   printf "%x.",$tmp[$i]
> }
> ---------------------------------------------
> 
> ausgabe: c0.a8. 1. 1. (daran musst du noch feilen)

Wenn man das oben erstmal hinter sich hat, gehts dann pl�tzlich ganz
simpel:

while ($dec){
        unshift @ip, ($dec % 256);
        $dec = $dec >>8;
}
print join(".", @ip)."\n";

Hier ist Modulo das kleinere �bel. Man k�nnte alternativ schreiben, um das
Bild von den geschobenen Bits zu behalten:

unshift @ip, ($integer - (($integer >> 8) << 8));    # W�rg!

(Oder kann man die Bits, die beim Shiften rechts rausfallen, irgendwie
auffangen?)

So richtig elegant finde ich aber keine der beiden L�sungen (aufgrund der
Schleifen), auch wenn ich sie beide mal so verwenden werde. Ich hatte
eigentlich einen wilden Einzeiler mit pack/unpack erwartet. ;-)

Dankesch�n!

-martin

-- 
            0 and 1. Now what could be so hard about that?
----------------------------------------------------------------------------
PUG - Penguin User Group Wiesbaden - http://www.pug.org

Antwort per Email an