Zum Inhalt springen
L

Wikipedia · einfach zusammengefasst · Stand

Magische Zahl (Informatik)

ASCII (meistverwendet). Hexadezimale Repräsentation von Zahlen (beispielsweise 305419896 = 0x12345678 ). Manchmal wird Hexspeak verwendet. Ein im Quellcode …

Inhalt4 Abschnitte
  1. 1. Drei Bedeutungen des Begriffs
  2. 2. Markierungen für Debugging und Fehlersuche
  3. 3. Magische Zahlen als Dateikennzeichen
  4. 4. Magische Zahlen im Quellcode vermeiden

Drei Bedeutungen des Begriffs

„Magische Zahl“ bezeichnet in der Informatik drei unterschiedliche Arten besonderer Werte. Erstens kann sie am Anfang einer Datei stehen und deren Dateityp kennzeichnen. Zweitens kann sie in Registern oder Speicherbereichen als auffällige Markierung für die Fehlersuche dienen. Drittens kann sie eine Zahl im Quellcode sein, deren Bedeutung nicht unmittelbar erkennbar ist. In dieser dritten Bedeutung handelt es sich meist um einen schlechten Programmierstil: Solche Werte sollten durch benannte Konstanten ersetzt werden.

Eine Konstante ist ein festgelegter Wert mit einem aussagekräftigen Namen. Dadurch werden Bedeutung und gegebenenfalls Herkunft einer Zahl sichtbar, und Änderungen lassen sich zuverlässiger im gesamten Programm durchführen.

Markierungen für Debugging und Fehlersuche

Bei der Darstellung von Speicherinhalten werden häufig Hexadezimalzahlen verwendet. Meist wirken solche Zahlen zufällig und unauffällig. Für die Fehlersuche kann es jedoch nützlich sein, Speicherbereiche oder Register mit einem Wert zu markieren, der sofort ins Auge fällt. Solche Werte werden häufig aus ASCII-Zeichen, aus der hexadezimalen Darstellung von Zahlen oder gelegentlich aus Hexspeak ausgewählt. Ein Beispiel ist 305419896 = 0x12345678.

Bekannt ist 0xDEADBEEF, das als „dead beef“ gelesen werden kann. Der Wert besitzt an sich keine besondere technische Bedeutung und kann durch andere lesbare Werte wie 0xABABABAB, 0x00C0FFEE oder 0x0BADF00D („bad food“) ersetzt werden. Entscheidend ist, dass er normalerweise selten auftritt. Bei einer Gleichverteilung von 32-Bit-Zahlen beträgt die Wahrscheinlichkeit 1:2^{32} = 1:4.294.967.296; nach dem Benfordschen Gesetz ist sie sogar geringer.

Taucht 0xDEADBEEF im Speicher auf, kann dies auf Fehler wie Pufferüberläufe oder uninitialisierte Variablen hinweisen. Speicherbereiche, in die das Programm nicht schreiben sollte, werden zu Debuggingzwecken manchmal mit diesem Wert gefüllt. Wird dort dennoch geschrieben, lässt sich der Fehler schnell erkennen. Viele Versionen des PowerPC-Prozessors initialisieren ihre Register nach einem Hardware-Reset mit 0xDEADBEEF. Der Wert wurde außerdem im originalen Mac-OS-Betriebssystem sowie bei den 1990 eingeführten RS/6000-Servern von IBM zu Diagnosezwecken verwendet.

Auch dezimale Zahlen können als auffällige Platzhalter dienen. Sie machen in Konzepten oder Präsentationen sichtbar, dass ein konkreter Zahlenwert belanglos ist. Im Programmiererumfeld wird häufig 42 verwendet. Weitere Beispiele sind „08/15“ und „4711“. Ein typisches Gedankenbeispiel lautet: Der Kunde „4711“ bestellt den Artikel „08/15“, ein anderer Kunde „42“ ebenfalls. Wenn nur ein Artikel „08/15“ vorrätig ist, muss das Programm den entsprechenden Fall behandeln.

Magische Zahlen als Dateikennzeichen

Bei Dateien ist eine magische Zahl ein spezieller Wert am Dateibeginn, anhand dessen ein Programm den Dateityp erkennt. Eine frühe Konvention unixartiger Betriebssysteme bestand aus zwei Magic Bytes am Anfang von Binärdateien. Zunächst wurden damit Objektdateien verschiedener Plattformen gekennzeichnet; später wurde das Verfahren auf viele andere Dateitypen übertragen.

Auch Dateien, die nicht mit einer klassischen Zahl beginnen, können eine kennzeichnende Zeichenfolge enthalten. XML beginnt beispielsweise mit „<?xml“. Wandelt man die Zeichen am Dateianfang in eine Zahl um, kann der Dateityp durch einen einfachen Vergleich bestimmt werden, ohne das gesamte Format analysieren zu müssen.

Typische Kennzeichnungen sind:

  • BOOTP/DHCP beginnt an der Stelle mit wichtigen Netzwerkparametern mit dem Magic Cookie 0x63825363.
  • Kompilierte Java-Klassendateien beginnen mit 0xCAFEBABE.
  • GIF-Dateien enthalten am Anfang den ASCII-Code für „GIF89a“ (0x474946383961) oder „GIF87a“ (0x474946383761).
  • JPEG/JFIF-Dateien beginnen mit 0xFFD8FF und enthalten außerdem die ASCII-Entsprechung für „JFIF“ (0x4A464946).
  • PNG-Dateien beginnen mit dem 8-Byte-MagicByte „\211 P N G \r \n \032 \n“ (0x89504e470d0a1a0a). Dieses ermöglicht auch die Erkennung von Dateiübertragungsproblemen.
  • Standard-MIDI-Dateien enthalten „MThd“ (0x4D546864), gefolgt von Metadaten.
  • Unix-Skripte beginnen normalerweise mit dem Shebang „#!“ (0x23 0x21) und einem Interpreterpfad, etwa „#!/usr/bin/perl“.
  • MS-DOS-EXE-Dateien sowie Microsoft-Windows-EXE- und -DLL-Dateien beginnen mit „MZ“ (0x4D5A), selten auch mit „ZM“ (0x5A4D).
  • Der Berkeley-Fast-File-System-Superblock wird je nach Version durch 0x19540119 oder 0x011954 identifiziert.
  • Programme für Game Boy und Game Boy Advance besitzen eine 48 oder 156 Byte lange magische Zahl, die ein Bitmap des Nintendo-Logos kodiert.
  • Alte Fat Binaries für Mac OS 9 beginnen mit „Joy!“ (0x4A6F7921).
  • TIFF-Dateien beginnen abhängig von der Endianness mit „II“ oder „MM“, gefolgt von 0x2A00 oder 0x002A; der Dezimalwert ist 42.
  • ZIP-Dateien beginnen mit „PK“. Das gilt auch für andere mit dem Deflate-Algorithmus komprimierte Dateien, etwa DOCX, XLSX und PPTX.

Das Unix-Kommando file liest und interpretiert solche Kennzeichnungen. Auch das Linux-Kernelmodul binfmt_misc erkennt den Dateityp einer Anwendung anhand magischer Zahlen. Die zugehörigen Regeln liegen in der Datei /usr/share/misc/magic.mgc, unter Debian in /usr/share/file/magic.mgc.

Magische Zahlen im Quellcode vermeiden

Im Quellcode bezeichnet „magische Zahl“ oder „hard coded value“ einen Zahlenwert, der unmittelbar zwischen die Befehle geschrieben wird und dessen Zweck nicht direkt erkennbar ist. Das erschwert die Lesbarkeit und kann Änderungen fehleranfällig machen. Besser ist eine benannte Konstante; bei einer einmaligen Verwendung kann auch eine sogenannte explanatory variable, also eine selbsterklärende Variable, sinnvoll sein. Eine direkte Inline-Kommentierung kann bei einmaliger Verwendung ebenfalls mit der Benennung konkurrieren.

Beispielhaft mischt folgendes Pascal-ähnliche Pseudoprogramm 52 Zahlen in einem Array:

for i from 1 to 52 { j:= i + randomInt(53 - i) - 1 swapEntries(i, j) }

randomInt(x) erzeugt eine Zahl zwischen 1 und x; swapEntries(i, j) vertauscht die Einträge i und j. Die Zahl 52 ist hier magisch. Verständlicher ist:

constant int cardGame_deckSize:= 52 for i from 1 to cardGame_deckSize { j:= i + randomInt(cardGame_deckSize + 1 - i) - 1 swapEntries(i, j) }

Die Benennung zeigt, wofür 52 steht. Soll die Größe des Kartenfeldes geändert werden, muss nur die Konstantendefinition angepasst werden. Im ersten Programm müsste außerdem die davon abhängige 53 geändert werden; in größeren Programmen kann dies unübersichtlich werden und Fehler verursachen. Alternativ könnte dort statt 53 auch „52 + 1“ stehen.

Weitere Vorteile sind, dass bedeutsame Zahlen übersichtlich am Programmanfang zusammengefasst werden und sich das Programm leichter parametrisieren lässt. Aus cardGame_deckSize kann ein Parameter werden:

function shuffle (int cardGame_deckSize) { for i from 1 to cardGame_deckSize { j:= i + randomInt(cardGame_deckSize + 1 - i) - 1 swapEntries(i, j) } }

Außerdem werden Tippfehler besser erkannt: Wird 52 versehentlich als 42 geschrieben, meldet der Compiler keinen Fehler, obwohl das Programm falsch arbeitet. Ein falsch geschriebener Name wie cardGame_dekcSize wird dagegen vom Compiler erkannt. Benannte Werte erleichtern schließlich auch das Debugging mit einem symbolischen Debugger.

Weiterlesen

Programmierung Beim Programmieren sind wesentliche Aspekte zur Softwarequalität zu berücksichtigen und durch die Gestaltung des Quellcodes umzusetzen. Siehe dazu als Beispiele … Debugger Funktionen eines Debuggers · die Steuerung des Programmablaufs, insbesondere durch Haltepunkte und die Einzelschritt-Verarbeitung von Befehlen · das Inspizieren … Extensible Markup Language Erweiterbare Auszeichnungssprache), abgekürzt XML, ist eine Auszeichnungssprache zur Darstellung hierarchisch strukturierter Daten im Format einer Textdatei … Dynamic Host Configuration Protocol Das Dynamic Host Configuration Protocol (DHCP) ist ein Kommunikationsprotokoll in der Computertechnik. Es ermöglicht die Zuweisung der Netzwerkkonfiguration … Compiler Ein Übersetzer zur Übertragung von Assembler-Quellprogrammen in Maschinensprache wird als Assembler oder Assemblierer bezeichnet. Geschichte. Bearbeiten. Java (Programmiersprache) Java ist eine objektorientierte Programmiersprache und eine eingetragene Marke des Unternehmens Sun Microsystems, welches 2010 von Oracle übernommen wurde. Bytecode Bytecode ist in der Informatik die Bezeichnung für eine Sammlung von Befehlen, also die Maschinensprache für eine virtuelle Maschine. American Standard Code for Information Interchange Der American Standard Code for Information Interchange (ASCII, alternativ US-ASCII, ausgesprochen [ˈæski], deutsch „Amerikanischer Standard-Code für den … Portable Network Graphics Die Kompression ist verlustfrei und dabei meist kompakter als vergleichbare Formate. · Unterstützung von Alpha-Transparenz (bis zu 16 Bit, also 65.536 Stufen; … Microsoft Windows Microsoft Windows (englische Aussprache [ˈmaɪ.kɹoʊ.sɒft ˈwɪn.doʊz]) bzw. Windows ist eine Reihe proprietärer grafischer Betriebssystemfamilien von Microsoft … Byte-Reihenfolge Die Byte-Reihenfolge (englisch byte order oder endianness) bezeichnet in der Informatik die Speicherorganisation für einfache Zahlenwerte, in erster Linie … Dezimalsystem Daneben führen noch – fachsprachlich in der elektronischen Datenverarbeitung – das Dualsystem (Binärsystem) sowie das Sedezimalsystem (Hexadezimalsystem) ein …