Was sind Hex-Zahlen?

    • Allgemein

    Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

      Was sind Hex-Zahlen?

      Ums vorwegzunehmen: Es gibt keine Hex-Zahlen. :P

      Wer von Hex-Zahlen redet, redet von Text: von Schrift und Schriftzeichen, von Strings und Chars.

      Das Hexadezimale Darstellungs-Format ist eine der 4 üblichen Konvention, in Text Zahlen darzustellen:
      1. binär: Es gibt nur die Ziffer-Zeichen '0' und '1'
      2. dezimal: Ziffer-Zeichen sind "0123456789"
      3. oktal: "01234567"
      4. hexadezimal: "0123456789ABCDEF"
      Noch-einmal: Es handelt sich um die Darstellung von Zahlen in Text - die Zahlen selbst geht das überhaupt nichts an.
      Beipiel: angenommen die Zahl 28.
      Dassis 28, und dassis immer 28 - egal, wie ichs hinschreib: hex: 1c, dezimal: 28, oktal: 34, binär: 11100


      Eigentlich könnte ich hier schließen, aber ich liebe es bisserl philosophisch ;):
      Schrift besteht aus Zeichen, und die Zeichen lassen sich unterteilen in Buchstaben, Ziffern und andere Zeichen. In VB.Net heißt der Datentyp für Text String, und der Schriftzeichen-Datentyp ist Char.
      Um ein Wort im Text zu bilden, nimmt man Buchstaben, und um eine Zahl im Text zu bilden nimmt man Ziffern. Sind alles Schriftzeichen, Chars.
      Das ganze ist dann ein Text, und ist keine Zahl, und sind auch keine Zahlen drinne, sondern Zeichen.

      Aufgrund der verschiedenen Konventionen sind Zahl-Darstellungen in Strings nie eindeutig: um eine Zahl aus einem Text richtig zu lesen, muß man die richtige Konvention anwenden (es gibt übrigens noch ganz annere Konventionen, länderspezifisch, oder etwa die wissenschaftliche Schreibweise 8| ).
      Vor allem aber sind Zahlen im Text Text, und sind keine Zahlen. Präziser wäre wohl, bei Ziffer-Gruppen von "Zahl-Worten" zu reden, im Gegensatz zu "Sprech-Worten" bei Buchstaben-Gruppen.
      Als Programmierer ists total wichtig, Zahlen und Text zu unterscheiden, denn Zahlen sind eindeutig, und Texte sinds nicht.
      Und mit Zahlen kannman rechnen, und mit Text kann mans nicht.
      Texte kannman zerteilen, zusammenfügen, und lesen - aber rechnen kannman damit nicht.
      Die Rede von "Hex-Zahlen" ist also bereits riskant, und könnte dazu verleiten, Text und Zahlen zu verwechseln, und am Ende findet man sich mit Texten rechnend wieder, anstatt mit Zahlen.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

      Text <-> Zahl - Konversion: Parsen und Formatieren

      Andauernd schlägt man sich also mit Konversionen zw. Text und Zahlen rum, schon weil man mit Zahlen zwar fabelhaft rechnen kann, aber man kann sie nicht anzeigen! - man kann nur String anzeigen! 8|

      Tatsächlich (ich philosophiere schonwieder) kann man überhaupt nix anzeigen ausser Strings. Deshalb ist die .ToString()- Methode auch eine der vier Public Methoden, die bereits der Mutter aller Klassen - der Klasse Object - eingebaut sind. Nun kannman alles anzeigen: einfach ToString überall anhängen ;)

      Aber diese vielen verflixten Konventionen! Hex, Dec, Bin, wissenschaftliches Format, Länder-Spezifica - wie soll man da sicher coden?
      Ja, is schwierig, und ist eine Wissenschaft für sich.
      Bisserl Theorie:
      Das Auslesen eines Strings und Umwandeln in eine Zahl nennt man parsen.
      Annersrum: Das Bilden eines Strings aus einer Zahl nennt man formatieren.

      (Parsen und Formatieren bedeuten eiglich ganz allgemein: Umwandeln von Symbolischem in Bedeutetes (das richtige Objekt), bzw. Generieren von Symbolik aus dem Objekt. (uiuiui! - Kierkegaard, ich komme!))

      Äh - wo warenwa? achja: Zahlen und Strings - parsen und formatieren, ja.
      So parst man nach Integer:

      VB.NET-Quellcode

      1. Dim i = Integer.Parse("28") 'dezimal in der lokalen Kultur
      2. i = Integer.Parse("28", Globalization.NumberStyles.AllowThousands) 'dezimal mit Variante: Tausender-Trennzeichen zulässig
      3. i = Integer.Parse("1c", Globalization.NumberStyles.HexNumber) 'hex
      4. i = Integer.Parse("1c", Globalization.NumberStyles.HexNumber, Globalization.CultureInfo.InvariantCulture) 'hex, kulturunabhängig
      Wie man sieht: Anfangs siehts einfach aus, aber wenn man sich mal bisserl in die Konventionen reinkniet, dann ist man schnell bei 2 zusätzlichen Parametern, mit vielervielerlei Bedeutungsmöglichkeiten.

      Aber es gibt ja auch noch annere Zahlen - ZB nach Double parst man so:

      VB.NET-Quellcode

      1. Dim dbl = Double.Parse("99,9") 'dezimal
      2. dbl = Double.Parse("99.9", Globalization.NumberStyles.AllowThousands) 'dezimal mit Variante: Tausender-Trennzeichen zulässig
      3. dbl = Double.Parse("99,9", Globalization.NumberStyles.HexNumber) 'hex
      4. dbl = Double.Parse("99,9", Globalization.NumberStyles.HexNumber, Globalization.CultureInfo.InvariantCulture) 'hex, kulturunabhängig
      (Ich hoffe, eine gewisse Systematik des Parsens wird bereits jetzt deutlich, und die Zahl-Typen Byte, Single, Decimal etc. darf ich auslassen. ;))
      (Kleiner Hinweis noch: Auch Boolean, und sogar DateTime und TimeSpan haben Parse- und Format-Funktionalität.)

      Hmm - und binär, oktal? Tja - isnix mit System, da muß jetzt die Convert-Klasse her:

      VB.NET-Quellcode

      1. dim i = Convert.ToInt32("11100", 2) 'bin
      2. i = Convert.ToInt32("34", 8) 'okt
      3. i = Convert.ToInt32("1c", 16) 'hex


      Gut, das war Parsen, nun kommt formatieren:

      VB.NET-Quellcode

      1. Dim n = 4 * 7
      2. Dim s = String.Format("4 * 7 = {0}", n)
      3. MessageBox.Show(s)
      4. s = String.Format("4 * 7 = {0:x}", n)
      5. MessageBox.Show(s)
      6. s = String.Format("4 * 7 = {0:000}", n)
      7. MessageBox.Show(s)
      8. s = String.Format("4 * 7 = &H{0:x}, und als 3-stellige Hex-Zahl: {0:x3}", n)
      9. MessageBox.Show(s)
      Das sind nur ein paar Varianten für einen Format-String, und ich hab hier noch nichtmal eine Kultur angegeben.

      Einfache Formate werden auch von .ToString() akzeptiert, ohne dass man olle String.Format-Function bemühen muß:

      VB.NET-Quellcode

      1. MessageBox.Show(n.ToString("x3"))


      Und für die Exoten binär und oktal nochmal olle Convert-Klasse:

      VB.NET-Quellcode

      1. MessageBox.Show(Convert.ToString(28, 2)) 'binäre-Darstellung von 28 anzeigen
      2. MessageBox.Show(Convert.ToString(28, 8)) 'oktal-Darstellung

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()