Ein ganz vereinfachtes Beispiel:
Angenommen, wir haben einen Speicherblock mit 4x4 Pixel-Bildern:
Code:
Übereinkommen: jedes Byte entspricht einem Farbwert.
0 ist schwarz, 1 ist weiß, jedes Bild belegt 4x4 = 16 Bytes
0110
1001
1111 <- ein A
1001
1110
1001
1001 <- ein D
1110
... usw.
Nennen wir mal diesen Block "Font". Das sind also Bilder mit uns bekannten Schriftzeichen.
Als erstes kommt ein Bild für 'A', dann für 'D' usw.
Wir können in einem weiteren Block die Zuordnung "CodeToImage" festhalten:
Code | Speicheradresse des Bildes
Code:
0 "Font" Startadresse
1 "Font" Startadresse" + 16
2 "Font" Startadresse" + 32
3 ...
dem Code 0 wird also ein Bild für 'A' zugeordnet, dem Code 1 ein Bild für 'D'
Es ist also ein CSCII - CDW's Standard Code for Information Interchange (nicht ganz so weit verbreitet, wie American SCII)
Würde das Bild für 'A' der 65 zugeordnet werden, für 'B' der 66 (usw. wie in der
ASCII - Wikipedia, the free encyclopedia) wäre das ASCII.
Für Anweisung
produziert der Compiler prinzipiell (je nach Zielplattform, Einstellungen usw) sowas:
Adresse, Anweisung
Code:
00: load 02 <= Adresse mit der Ausgabekodierung
01: basic_print <= aufruf der Ausgabefunktion (Betriebssystem,
direkter BIOS Zeichenfunktionsaufruf, Aufruf der Bibliotheksfunktion)
02: 65 <- ASCII Kodierung für 'A'
03: 68 <- ASCII Kodierung für 'D'
04: 00 <- Stopp = Terminierungszeichen, eine Vereinbarung.
oder, wenn der Compiler standardmäßig CSCII - Nutzung annimmt:
Code:
00: load 02
01: basic_print
02: 00 <- CSCII Kodierung für 'A'
03: 01 <- CSCII Kodierung für 'D'
04: 99 <- Stopp = Terminierungszeichen nach ... .
"basic_print" ist dann eine Funktion, die für jeden ASCII/CSCII Code das passende Bild heraussucht
Code:
image =code_to_image_map[ascii_code] // nehme aus der Zuorndungstabelle die richtige Bildadresse
oder direkt:
image = Speicher_mit_bildern[ascii_code * (große_des_einzelnen_bilds=16))]
und ganz "stupide" das Bild Pixel für Pixel zeichnet:
Code:
for (x = 0; x < 4; x++)
for (y = 0; y < 4; y++)
set_output_pixel(output_x + x, output_y + y, image[x][y])
Sogennante "basic_fonts" gibt es schon im BIOS-ROM (entweder der Grafikkarte oder/und des Rechners) - dank diesen sieht man auch die hübschen Statusmeldungen schon beim Einschalten des Rechners
Es gibt im übrigen viele andere Kodierungen - UTF, diverse ISOs
Bsp:
0xE2 0x98 0x8F : ☏
0xE2 0x98 0xA2: ☢
---------
Also, wenn Du einen "String" direkt speicherst, speicherst Du nicht die "Zeichen" selbst oder irgendwelche Bilder, sondern eigentlich die Kodierung für den eingegebenen Text. Ganz stumpf gesagt: eine Abfolge von 0 und 1.
Betrachtet man die gespeicherte Datei in einem Hexeditor, sieht man z.B
48 65 6c 6c 6f 20 57 6f für ein "Hello World"
dabei nimmt der Editor an, dass eine Abfolge von acht 0en und 1en immer eine Zahl darstellt und dass der Nutzer diese Zahl direkt in einer hexadezimalen Representation sehen möchte. Also sorgt wiederum der Editor, dass für eine Abfolge von vier 0en und 1en (ein Nibble) ein passendes Bild aus 16 möglichen auf dem Monitor erscheint: 0110 1111 => '6F' (zwei Bilder: eins für '6', eins für 'F')
dabei würde ein Texteditor 0100 1111 als ein 'd' erscheinen lassen.
Hex,Dezimal, Binär sind nur Darstellungen/Representationen:
nicht angebissene Äpfel können binär als 01100, dezimal als 12, octal als 14, hexadizimal als 0C dargestellt werden.
Dadurch werden es nicht mehr und nicht weniger
Betrachtet man seine gespeicherte Datei mit einem Texteditor, versucht dieser automatisch die Zahlen einem Zeichenbild zuzuordnen und diese auszugeben. Was z.B ohne explizite Angabe der beim Speichern genutzten Kodierung auch mal schief gehen kann (wenn z.B ÄÖÜ in UTF-8 kodiert wurden, der Texteditor aber eine ASCII Kodierung annimmt). Anderes Beispiel sind Webseiten, die die falsche Kodierung angeben und man statt ä ö ü "Kästchen" oder "komische Zeichen" sieht.