Hexadezimalzahlen

Nostalgie verbreitet sich, wenn ich darüber nachdenke, wie ich meine Faszination für Hexadezimalzahlen am besten erklären soll. Dazu muss ich ein wenig ausholen:

Seinen Ursprung hat das Ganze nämlich bei meinem Umstieg auf Apple-Computer, welcher nun 3 – 4 Jahre zurück liegt. Schon unter Microsoft Windows habe ich meine ersten Schritte in der Applikationsentwicklung gewagt und dass ich unter Mac OS X richtig lernen will zu programmieren, war für mich schon vor dem Kauf klar. Noch bevor der (in der Zwischenzeit nicht mehr gebrauchte) iMac im Hause war, habe ich mir Gedanken über ein Projekt gemacht, welches ich realisieren wollte: den SigConverter.

Dieses kleine Projekt, musste dann natürlich erst mal warten, da ich mich in die ganze Geschichte von Cocoa, Objective-C und Xcode einarbeiten musste, doch als ich das Buch Objective-C und Cocoa (1. Auflage) von Klaus M. Rodewig durchgeackert hatte, habe ich mich wieder an meine Programmidee erinnert und begonnen mein erstes eigenes Programm zu schreiben. Natürlich bin ich über viele Hürden gestolpert und eine davon war das umrechnen von hexadezimalen in dezimale Zahlen. Damals habe ich das ganze sehr umständlich gelöst und da ich abgesehen von einem Controller keine eigenen Klassen verwendet habe, war diese Lösung auch nicht wirklich wiederverwendbar.

Nun, letztens habe ich ein ähnliches Projekt realisiert und stand an einem gewissen Punkt vor dem selben Problem: umrechnen von hexadezimal nach dezimal und umgekehrt. Da ich in all den Jahren doch einiges dazugelernt habe, kann ich wohl behaupten, dass die Lösung, welche ich nun benutze, sehr gut wiederverwendbar und leicht verständlich ist. Natürlich will ich sie euch nicht vorenthalten:

Die Grundidee ist die Erstellung einer Kategorie für NSNumber, welche die Verwendung einer hexadezimalen Zahl erlaubt. Die Kategorie umfasst drei Methoden:

Die numberWithHex: – Methode ist schnell erklärt, da es ein simpler Einzeiler ist:

Es wird also schlicht und ergreifend eine NSNumber mit der noch zu erstellenden init-Methode zurückgegeben. (Ein herzliches Dankeschön an dieser Stelle an Axamblis für diesen Tipp!)

In der initWithHex: – Methode wird es ein wenig komplizierter, da sich dahinter ein wenig Mathematik verbirgt. Hier nun einmal das ganze Listing:

  • Die erste Linie stellt sicher, dass wir uns mit dem übergebenen String nur um Grossbuchstaben kümmern müssen.
  • In der result-Variable  wird die ganze Berechnung gespeichert, welche nun folgt.
  • In der Schleife wird der String von rechts nach links abgearbeitet ([value length] – (i + 1)).
  • In der switch-Verzweigung werden zuerst alle möglichen Zahlen und Buchstaben behandelt und falls ein ungültiger Charakter gefunden wird, gibt die init-Methode direkt nil zurück.
  • Die Berechnungen in Linie 13 und 16 liegen der Mathematik von hexadezimalen Zahlen und dem ASCII-Wert der Zahlen und Buchstaben zugrunde. Die Potenz zur Basis 16 zeigt hier auch, warum diese Zahlen überhaupt “hexadezimal”  genannt werden, da sie nicht auf der Basis 10 (wie das Dezimalsystem) basieren, sondern wie gesagt auf 16. Die Subtraktion von 48 und 55 lässt sich darauf zurückführen, dass das Zeichen ‘0’ einen ASCII-Wert von 48 und das grosse ‘A’ einen Wert von 65 hat. Bei der Subtraktion ergeben sich dann die Zahlenwerte 0 und 10, wie man sich das wünscht.
  • Der Rest der Funktion ist dann schlicht eine Zuweisung von self mit dem errechneten Wert  und dir Rückgabe desselben.

Die hexValue – Methode ist dann wieder ein simpler Einzeiler:

Die %X Formatierungsanweisung wandelt den übergebenen int bereits in hexadezimale Schreibweise um und somit entfällt jegliche zusätzliche Berechnung.

Ich hoffe, dass die Erklärungen der einzelnen Codeabschnitte nicht zu kurz gekommen ist und dass sich keine Fehler eingeschlichen haben.

Tags: ,

Kommentieren