Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Zahl in IP umwandeln

66 views
Skip to first unread message

Peter Müller

unread,
Aug 16, 2013, 12:50:38 PM8/16/13
to
In Mathe war ich schon immer schwach:
Ich m�chte eine Zahl in eine IP umwandeln.

ID = "2469417810"
Die dazugeh�rige IP w�re 82.83.48.147

a = Int(ID / 256 ^ 3) 'ist das letzte Oktett
b = Int(ID - a * 256 ^ 3) / 256 ^ 2 'ist das vorletzte Oktett
c = Int(ID - a * 256 ^ 3 - b * 256 ^ 2) / 256 'ist das zweite Oktett
d = Int(ID - a * 256 ^ 3 - b - c * 256 ^ 2) / 256 'ist das erste Oktett

IP = d & "." & c & "." & b & "." & a

Int steht f�r Integer (Ganzzahl)
Die Werte f�r a, b und c sind ok
Ich bekomme es aber f�r d nicht hin.
Das Ergebnis in d sollte 82 sein.

Gru�
Peter

Markus Salman

unread,
Aug 17, 2013, 5:34:51 AM8/17/13
to
Am 16.08.2013 18:50, schrieb Peter Müller:
> In Mathe war ich schon immer schwach:
> Ich möchte eine Zahl in eine IP umwandeln.
>
> ID = "2469417810"
> Die dazugehörige IP wäre 82.83.48.147
>
> a = Int(ID / 256 ^ 3) 'ist das letzte Oktett
> b = Int(ID - a * 256 ^ 3) / 256 ^ 2 'ist das vorletzte Oktett
> c = Int(ID - a * 256 ^ 3 - b * 256 ^ 2) / 256 'ist das zweite Oktett
> d = Int(ID - a * 256 ^ 3 - b - c * 256 ^ 2) / 256 'ist das erste Oktett
>
> IP = d & "." & c & "." & b & "." & a
>
> Int steht für Integer (Ganzzahl)
> Die Werte für a, b und c sind ok
> Ich bekomme es aber für d nicht hin.
> Das Ergebnis in d sollte 82 sein.
>
> Gruß
> Peter
>

Rein mathematisch:

Die Dezimalzahl 2469417810 wird ins eine im 256"-System umgewandelt
(Horner-Schema)

Gehe nach folgendem Verfahren vor:
(1) Teile die Zahl mit Rest durch 256.
(2) Der Divisionsrest ist die nächste "Zahl" (von rechts nach links).
(3) Falls der (ganzzahlige) Quotient = 0 ist, bist du fertig,
andernfalls nimm den (ganzzahligen) Quotienten als neue Zahl
und wiederhole ab (1).

2469417810 : 256 = 9646163 Rest: 82
9646163 : 256 = 37680 Rest: 83
37680 : 256 = 147 Rest: 48
147 : 256 = 0 Rest: 147

Resultat: 82.83.48.147

Als Gleichungen (für Programme?)

d = (ID/256 - INT(ID/256) * 256 Rest
ID_c = ID/256 - (ID/256 - INT(ID/256) Divisionsrest
c = (ID_c/256 - INT(ID_c/256) * 256 Rest (neu)
ID_b = ID_c/256 - (ID_c/256 - INT(ID_c/256) Divisionsrest (neu)
b = (ID_b/256 - INT(ID_b/256) * 256 Rest (neu)
ID_a = ID_b/256 - (ID_b/256 - INT(ID_b/256) Divisionsrest (neu)
a = (ID_a/256 - INT(ID_a/256) * 256 Rest (neu)
ID_0 = ID_0/256 - (ID_0/256 - INT(ID_0/256) Divisionsrest (neu)

Anmerkungen:
Die letzte Zeile kann gut zur Fehlerkontrolle (<>0) genutzt werden.
Das Programm ließe sich noch leichter rekursiv schreiben mit einer
Zählvariablen, z.B. i, Start für die Ausgangsvariablen ID mit ID_i und
i=3, also ID_3
bei jedem Durchlauf der Schleife i um 1 reduzieren, bei einer
Fußkontrolle könnte bei Null gestoppt werden.
Denkbar wäre auch eine Umsetzung mit Zellen (Datenbank, Tabelle), dann
kann man hinterher auch leicht dort die Ergebnisse auslesen.


Detlef Müller

unread,
Aug 17, 2013, 4:04:37 PM8/17/13
to
On 16.08.2013 18:50, Peter M�ller wrote:
> In Mathe war ich schon immer schwach:
> Ich m�chte eine Zahl in eine IP umwandeln.
>
> ID = "2469417810"
> Die dazugeh�rige IP w�re 82.83.48.147
>
> a = Int(ID / 256 ^ 3) 'ist das letzte Oktett
> b = Int(ID - a * 256 ^ 3) / 256 ^ 2 'ist das vorletzte Oktett
> c = Int(ID - a * 256 ^ 3 - b * 256 ^ 2) / 256 'ist das zweite Oktett

Soweit kann ich es nachvollziehen ...

> d = Int(ID - a * 256 ^ 3 - b - c * 256 ^ 2) / 256 'ist das erste Oktett

Aber wieso geht es nicht genauso weiter, ich h�tte konsequenter
Weise nun

d = ID - a * 256 ^ 3- b * 256 ^ 2 - c * 256

erwartet (durch 256^0=1 braucht man nat�rlich nicht zu dividieren).

>
> IP = d & "." & c & "." & b & "." & a
>
> Int steht f�r Integer (Ganzzahl)
> Die Werte f�r a, b und c sind ok
> Ich bekomme es aber f�r d nicht hin.
> Das Ergebnis in d sollte 82 sein.
>

Man sollte die Stellen auch von hinten her abgreifen k�nnen:

d = ID%256
ID=Id/256; c = ID%256;
ID=Id/256; b = ID%256;
ID=Id/256; a = ID

Sehr Maschinengenrecht, da (bin�r gesehen) gar keine
wirkliche Multiplikation von N�ten ist (nur Bin�rstellen
verschieben und Ausblenden).

Gru�,
Detlef

> Gru�
> Peter
>


--
Dr. Detlef M�ller,
http://www.mathe-doktor.de oder http://mathe-doktor.de

Markus Salman

unread,
Aug 18, 2013, 6:21:28 AM8/18/13
to
...
> Man sollte die Stellen auch von hinten her abgreifen können:
...WIe ich schon schrieb: Horner-Schema.
Ich behaupte, dass es nur in sehr wenigen Fällen auch von vorne geht.
Das ist die Ausnahme - wenn es überhaupt geht.

Markus

Detlef Müller

unread,
Aug 18, 2013, 5:50:03 PM8/18/13
to
On 18.08.2013 12:21, Markus Salman wrote:
> ...
>> Man sollte die Stellen auch von hinten her abgreifen können:
> ...WIe ich schon schrieb: Horner-Schema.

Unter dem Namen kenne ich nur die umgekehrte Rechnung,
nämlich a_n x^n + ... + a_0 mittels

a_n --> an*x + a_{n-1} --> (an*x + a_{n-1})*x+a_{n-2}
--> (...)*x+a_{n-3} --> ...

auszuwerten.

> Ich behaupte, dass es nur in sehr wenigen Fällen auch von vorne geht.
> Das ist die Ausnahme - wenn es überhaupt geht.
>

Das geht für alle Natürlichen Zahlen N und jede natürliche
Basis b>1 auch "von Vorne".

Es wird sogar oft als erstes so in der Schule gezeigt, weil
man ja auch im Dezimalsystem gewohnt ist Zahlen von den höherwertigen
Stellen her aufzubauen (auch sprachlich bis auf Deutsch-übliche
Dreher bei zweistelligen Zahlen).

Der Nachteil ist, daß man dabei vorab bestimmen muß, mit welcher
b-Potenz n man anzufangen hat (wenngleich das fix geht,
da b^k naturgemäß exponentiell in k wächst).

Im Beispiel mit den ip's ist b=256, n=3 klar und Peters Methode
(mit der Korrektur für den letzten Schritt) sollte auch
funktionieren.

Natürlich ist Deine Methode eleganter.

Gruß,
Detlef

> Markus
>


--
Dr. Detlef Müller,

Ulrich D i e z

unread,
Aug 24, 2013, 5:29:08 AM8/24/13
to
Peter Müller schrieb:

> ID = "2469417810"
> Die dazugehörige IP wäre 82.83.48.147

Um ausgehend von der ID die IP zu erhalten, gilt es, die ID als
Zahlendarstelllung im
Stellenwertnotationssystem zur Basis 10 auffassen, daraus eine
Zahlendarstellung im
Stellenwertnotationssystem zur Basis 256 zu berechnen, die
Abfolge der Ziffern der
Darstellung im Stellenwertnotationssystem zur Basis 256
umzukehren und dann jede
Ziffer aus dieser umgekehrten Abfolge für sich wieder im
Stellenwertnotationssystem
zur Basis 10 darzustellen.

Für Basiswechsel bei natürlichen Zahlen stelle ich mal zwei
Methoden anheim.

Angenommen, man möchte eine Zahl u mit der Basis-b-Darstellung
(u_m ... u_3 u_2 u_1 u_0)_b
in ihre Basis-B-Darstellung (U_M ... U_3 U_2 U_1 U_0)_B
konvertieren.

Methode 1 - (Horner-Schema; Berechnung des Werts der einzelnen
Basis-B-Ziffern U_K erfolgt in
der Basis-b-Arithmetik):

Schritt 1 (initialisieren) : Setze Hilfsvariable K := 0 und
setze Hilfsvariable L := u und führe dann Schritt 2 aus.
Schritt 2: Setze U_K := L MOD B und setze dann L := L DIV B.
Wenn nun L = 0, dann terminere, ansonsten führe
Schritt 3 aus.
Schritt 3: Setze K : = K+1 und führe dann Schritt 2 aus.

Anders ausgedrückt:

U_0 = (u) MOD B
U_1 = ((u) DIV B) MOD B
U_2 = (((u) DIV B) DIV B) MOD B
U_3 = ((((u) DIV B) DIV B) DIV B) MOD B
...
U_M ist erreicht, wenn (...((((u) DIV B) DIV B) DIV B)...DIV B)
= 0


Methode 2 - (Basis-B-Arithmetik; insbesondere dann praktikabel,
wenn B > b.)

Berechne in der Basis-B-Arithmetik das Polynom
(( ... (u_m * b + u_(m-1)) *b + ...) *b + u_1) * b + u_0 .

Schritt 1 (initialisieren) : Setze Hilfsvariable K := m und
setze L := 0 und führe dann Schritt 2 aus.
Schritt 2: Setze L := L + u_K.
Wenn K = 0, dann terminere mit dem Ergebnis L,
ansonsten führe Schritt 3 aus.
Schritt 3: Setze K := K -1 und setze L : =L*b und führe dann
Schritt 2 aus.

Ulrich

Ulrich D i e z

unread,
Aug 24, 2013, 8:21:12 AM8/24/13
to
Peter M�ller schrieb:

> ID = "2469417810"
> Die dazugeh�rige IP w�re 82.83.48.147

Um ausgehend von der ID die IP zu erhalten, gilt es, die ID als Zahlendarstelllung im
Stellenwertnotationssystem zur Basis 10 auffassen, daraus eine Zahlendarstellung im
Stellenwertnotationssystem zur Basis 256 zu berechnen, die Abfolge der Ziffern der
Darstellung im Stellenwertnotationssystem zur Basis 256 umzukehren und dann jede
Ziffer aus dieser umgekehrten Abfolge f�r sich wieder im Stellenwertnotationssystem
zur Basis 10 darzustellen.

F�r Basiswechsel bei nat�rlichen Zahlen stelle ich mal zwei Methoden anheim.

Angenommen, man m�chte eine Zahl u mit der Basis-b-Darstellung (u_m ... u_3 u_2 u_1 u_0)_b
in ihre Basis-B-Darstellung (U_M ... U_3 U_2 U_1 U_0)_B konvertieren.

Methode 1 - (Horner-Schema; Berechnung des Werts der einzelnen Basis-B-Ziffern U_K erfolgt in
der Basis-b-Arithmetik):

Schritt 1 (initialisieren) : Setze Hilfsvariable K := 0 und setze Hilfsvariable L := u und f�hre dann Schritt 2 aus.
Schritt 2: Setze U_K := L MOD B und setze dann L := L DIV B.
Wenn nun L = 0, dann terminere, ansonsten f�hre Schritt 3 aus.
Schritt 3: Setze K : = K+1 und f�hre dann Schritt 2 aus.

Anders ausgedr�ckt:

U_0 = (u) MOD B
U_1 = ((u) DIV B) MOD B
U_2 = (((u) DIV B) DIV B) MOD B
U_3 = ((((u) DIV B) DIV B) DIV B) MOD B
...
U_M ist erreicht, wenn (...((((u) DIV B) DIV B) DIV B)...DIV B) = 0


Methode 2 - (Basis-B-Arithmetik; insbesondere dann praktikabel, wenn B > b.)

Berechne in der Basis-B-Arithmetik das Polynom
(( ... (u_m * b + u_(m-1)) *b + ...) *b + u_1) * b + u_0 .

Schritt 1 (initialisieren) : Setze Hilfsvariable K := m und setze L := 0 und f�hre dann Schritt 2 aus.
Schritt 2: Setze L := L + u_K.
Wenn K = 0, dann terminere mit dem Ergebnis L, ansonsten f�hre Schritt 3 aus.
Schritt 3: Setze K := K -1 und setze L : =L*b und f�hre dann Schritt 2 aus.

Ulrich
0 new messages