Zahlen, bitte! Tote Rinder und andere magische Zahlen
Rindfleisch, Kaffee, Kuchen und verdorbenes Essen haben schon längst den Weg vom Nerd-Speiseplan in Betriebssysteme und Anwendungen gefunden – in Form von Magic Numbers. Doch wozu braucht man die eigentlich?

An der Zahl 3.735.928.559 ist auf den ersten Blick nichts besonders, auĂźer vielleicht ihre sperrige Primfaktorzerlegung: 11 Ă— 257 Ă— 1321517. Erst bei Darstellung als hexadezimale Zahl 0xDEADBEEF
liest man darin "dead beef" oder "totes Rindfleisch".
Magische Zahlen in der Programmierung
Solche "magischen Zahlen" haben in der Programmierung verschiedene Aufgaben. Sie dienen beispielsweise als auffällige Signalwörter in (Netzwerk-)Protokollen, als Hilfsmittel zur Analyse von Speicherauszügen (Hexdumps) oder zur Kennzeichnung von Dateiformaten. Da Speicherauszüge traditionell (auch) im Hexadezimalsystem dargestellt werden, bieten sich Zahlen an, die in dieser Schreibweise herausstechen und nicht zufällig auftreten können.
Das oben genannte 0xDEADBEEF
ist ein schon aus Amiga-Zeiten bekannter Klassiker. Dort wurde vom Debugger Mungwall nicht zugewiesener Speicher damit gefĂĽllt. Zugriffe darauf fĂĽhrten zum sofortigen Crash (wobei damals eigentlich nur wichtig war, dass die Zahl ungerade war).
Beispiele schöner magischer Zahlen
Bei der Schöpfung solcher Magic Numbers trifft das eingeschränkte Alphabet des hexadezimalen Systems auf die Kreativität der Programmierer, die fehlende Buchstaben durch Zahlen ersetzen, etwa 0
fĂĽr O, 1
fĂĽr L, 5
fĂĽr S, 7
für T, ... – die Geburtsstunde von Hexspeak (als Vorläufer von Leetspeak).
0x0DEFACED
: "defaced"
ehemalige Gastsignatur von Linux in Microsofts Hyper-V
0xCAFEBABE
/ 0xCAFED00D
: "cafe babe / cafe dude"
kompilierte respektive mit Pack200 komprimierte Java-Klassen
0x8BADF00D
: "ate bad food"
Exception Code in iOS Crash Reports, falls Apps zu lange beim Start oder Beenden brauchen
0xBEEFCACE
: "beef cake"
magische Zahl in Ressource-Dateien von Microsoft .NET
0xDEADC0DE
: "dead code"
Marker in der OpenWRT-Routerfirmware
0xDEADFA11
: "deadfall"
Exception Code in iOS Crash Reports bei erzwungenem Beenden von Apps
0xDEFEC8ED
: "defecated"
Kennzeichnung fĂĽr Core Dumps bei Open Solaris
0xFEE1DEAD
: "feel dead"
Signal fĂĽr einen Linux-Reboot
Eine (fĂĽr Microsoft) unrĂĽhmliche Anekdote am Rande: Der ursprĂĽngliche Wert fĂĽr die Linux-Gastsignatur bei Hyper-V lautete 0xB16B00B5
, welches sich mit zusammengekniffenen Augen oder Kenntnis von Leetspeak als "big boobs" (groĂźe BrĂĽste) entziffern lieĂź. Nach Protesten aus der (Linux-)Community wurde der Wert unleserlich gemacht (defaced).
Bei den meisten Magic-Debug-Werten handelt es sich um 32-Bit-Worte (8 Hexadezimalziffern), es gibt aber durchaus auch 48 bittige (0xBADBADBADBAD
) und zunehmend mehr 64-Bit-Worte wie 0xBADC0FFEE0DDF00D
("bad coffee odd food") fĂĽr nicht initialisierte CPU-Register bei IBMs RS/6000-Systemen.
Mal Hex, mal ASCII
Längst nicht alle Magic Numbers lassen sich direkt im Hexdump lesen, dazu wäre auch der mögliche Wortschatz zu eingeschränkt und unnötig kryptisch. Stattdessen enthalten Dateien häufig Werte, die sich als ASCII lesen lassen. Die meisten GIF-Dateien beginnen beispielsweise mit 0x474946383961, was in ASCII-Darstellung "GIF89a" ergibt.
Dateiformate lassen sich daher von Programmen und Betriebssystemen nicht nur ĂĽber ihre Dateiendung identifizieren, sondern durch typische enthaltene Zeichenfolgen (Signaturen) in den Datei-Headern oder im Datenstrom selbst:
Unter Unix lässt sich mit dem file
-Kommando der Typ einer Datei herausfinden; die Ăśbersetzungstabelle fĂĽr diese magischen Muster steckt passenderweise in einer Datei namens magic
. Unter Windows gibt es beispielsweise das Tool TrID, das solche Signaturen analysiert:
Dateirettungstools wie PhotoRec nutzen diese Signaturen beispielsweise, um auf kaputten Dateisystemen Datei(typen) zu identifizieren und Inhalte zu restaurieren. (vza)