Inhalt
Die Fakten:
Plattform: | codewars.com |
Name: | IPv4 to int32 |
Level: | 6 kyu |
Sprache: | TypeScript |
Beschreibung:
Take the following IPv4 address: 128.32.10.1
. This address has 4 octets where each octet is a single byte (or 8 bits).
- 1st octet 128 has the binary representation: 10000000
- 2nd octet 32 has the binary representation: 00100000
- 3rd octet 10 has the binary representation: 00001010
- 4th octet 1 has the binary representation: 00000001
So 128.32.10.1
== 10000000.00100000.00001010.00000001
Because the above IP address has 32 bits, we can represent it as the 32 bit number: 2149583361.
Write a function ip_to_int32(ip)
( JS: ipToInt32(ip)
) that takes an IPv4 address and returns
a 32 bit number.
Example
"128.32.10.1" => 2149583361
Quelle: codewars.com
Lösung
Pseudo-Code
Wie immer gibt's reichlich Varianten, hier ist eine meiner.
Erst die Lösungsschritte in Pseudo-Code. Los geht’s:
Lösungsschritte
Schritt 1
Als Erstes brauchen wir ein Array, damit wir da durch loopen können.
Schritt 2
Dann der Loop.
Schritt 3
Wir müssen jede der 4 Zahlen in ihre 8-stellige binäre Version verwandeln.
Schritt 4
Dann machen wir aus dem Array wieder einen String.
Schritt 5
Damit wir anschließend diese 32-Bit Binär-Zahl in eine Dezimalzahl umwandeln können.
Code
Geil. Übersetzen wir unseren Pseudo-Code in TypeScript:
Lösungsschritte
Meine erste Zeile:
export function ipToInt32(ip: string): number {
Jetzt den String in ein Array umwandeln:
const binary32bit = ip.split(".");
Dazu splitten wir den String einfach an den Punkten.
Da wir TypeScript
verwenden, müssen wir die String-Zahlen in richtige Zahlen umwandeln:
.map(Number)
Das ginge auch zusammen mit dem nächsten Schritt, aber mit diesem .map(Number)
-Zwischenschritt bleibt alles schön übersichtlich.
Jetzt die Umwandlung von einer Zahl zu einem 8-stelligen binären String:
.map((num) => num.toString(2).padStart(8, "0"))
Auch hier drängt sich wieder .map()
auf. Denn wir wollen genauso viele Elemente zurück haben wie rein gegangen sind.
Das (optionale) Argument 2
in .toString()
wandelt die Zahl in einen binären String um.
Da nicht jede binäre Zahl automatisch 8 Stellen (Bits) hat, hängen wir die fehlenden Nullen noch vorne dran.
Dann machen wir aus den Elementen des Arrays einen einzigen String. Die Punkte brauchen wir nicht mehr:
.join("");
Wir erhalten einen 32-stelligen binären String.
Jetzt nur noch den binären String in eine Dezimalzahl umwandeln und zurückgeben:
return parseInt(binary32bit, 2);
}
Voilá! 💪
Komplettlösung
export function ipToInt32(ip: string): number {
const binary32bit = ip
.split(".")
.map(Number)
.map((num) => num.toString(2).padStart(8, "0"))
.join("");
return parseInt(binary32bit, 2);
}