Def. Unter Codierung versteht man das Umsetzen einer vorliegenden Repräsentation A in eine andere Repräsentation B . Häufig liegen beide Repräsentationen A und B in der selben Abstraktionsebene. Die Interpretation von B nach A muss eindeutig sein. Ist sie auch umkehrbar eindeutig, so spricht man von einer Umcodierung .
Die folgende Tabelle zeigt eine Reihe mehr oder weniger gebräuchlicher binärer Codierungen für Dezimalziffern.
Ziffer | BCD | Gray | Exzess3 | Gray- | Aiken | biquinär | 1-aus-10 | 2-aus-5 | CCIT-2 |
---|---|---|---|---|---|---|---|---|---|
0 | 0000 | 0000 | 0011 | 0010 | 0000 | 000001 | 0000000001 | 11000 | 01101 |
1 | 0001 | 0001 | 0100 | 0110 | 0001 | 000010 | 0000000010 | 00011 | 11101 |
2 | 0010 | 0011 | 0101 | 0111 | 0010 | 000100 | 0000000100 | 00101 | 11001 |
3 | 0011 | 0010 | 0110 | 0101 | 0011 | 001000 | 0000001000 | 00110 | 10000 |
4 | 0100 | 0110 | 0111 | 0100 | 0100 | 010000 | 0000010000 | 01001 | 01010 |
5 | 0101 | 0111 | 1000 | 1100 | 1011 | 100001 | 0000100000 | 01010 | 00001 |
6 | 0110 | 0101 | 1001 | 1101 | 1100 | 100010 | 0001000000 | 01100 | 10101 |
7 | 0111 | 0100 | 1010 | 1111 | 1101 | 100100 | 0010000000 | 10001 | 11100 |
8 | 1000 | 1100 | 1011 | 1110 | 1110 | 101000 | 0100000000 | 10010 | 01100 |
9 | 1001 | 1101 | 1100 | 1010 | 1111 | 110000 | 1000000000 | 10100 | 00011 |
Jede Wandlung von einem Code dieser Tabelle in einen anderen der Tabelle ist eine Umcodierung. Welcher Code vorliegt, geht nicht aus den Codewörtern hervor.
Def. Werden zur Repräsentation B Wörter eines Zeichenvorrats Z verwendet, so bezeichnet man diese als Codewörter .
Def. Die Menge aller Codewörter heißt Code .
Def. Ein Code, dessen Codewörter alle dieselbe Länge haben, heißt Blockcode .
Def. Enthält ein Zeichenvorrat nur genau zwei verschiedene Zeichen, so nennt man diese Zeichen Binärzeichen und Wörter aus diesen Binärwörter .
Def. Sind die Codewörter Binärwörter, so liegt ein Binärcode vor.
Alle in der obigen Tabelle genannten Codes sind Binärcodes, jeweils eine Spalte listet alle Codewörter des Codes. Heute werden Zahlen, mit denen gerechnet werden soll, zumeist nicht dezimal gespeichert. Die genannten Codes sind daher nicht sehr gebräuchlich.
Außerordentlich wichtig ist dagegen die Codierung von geschriebenem Text. Man trennt dabei den reinen Text von seiner Formatierung. Der reine Text besteht aus der Reihenfolge der Zeichen. Die Formatierung dagegen gibt die Wahl des Fonts, die Größe, Farbe etc. an. Der reine Text wird üblicherweise codiert mit 8-Bit-Wörtern pro Zeichen. Das ermöglicht die Benutzung von 256 verschiedenen Symbolen einschließlich einiger Steuerzeichen für den Drucker. Leider sind das zu wenig Zeichen, um alle nationalen Zeichensätze enthalten zu können. Der reine Text benötigt daher immer die Information, welcher nationale Zeichensatz verwendet werden soll.
Die folgende Tabelle liefert den ASCII-Code in Matrixform. Das zu einem Zeichen gehörige Codewort wird nach Klick auf das Zeichen in der Titelleiste in rot dargestellt, und zwar als 8-Bit-Binärwort, 2-stellig Hexa und als Zahlenwert der Ganzzahlinterpretation.
asciimat
Die Schwierigkeiten im Umgang mit verschiedenen nationalen und speziellen Zeichensätzen einerseits und die Verfügbarkeit großer und billiger Speicher haben zur Entwicklung des 16-Bit-Uni-Codes geführt, der in 65536 Codewörtern die nationalen Zeichensätze praktisch aller lebenden Schriften einschließlich der chinesischen und japanischen und der Blindenschrift ermöglicht sowie auch die der meisten historischen Schriften wie Ogham und Runen. Auch eine sehr große Zahl von Symbolen ist vorhanden inklusive aller nötigen Zeichen für einen klassischen Notensatz.
Einschrittige Codes
Eine Menge, in der eine Ordnungsrelation gilt, kann durch einen einschrittigen Binärcode repräsentiert werden. Benachbarte Elemente der Menge werden dabei repräsentiert durch Binärwörter, die sich in genau einer Stelle unterscheiden. Solche Codes müssen immer dann benutzt werden, wenn das Ablesen der Bits nicht verhindert werden kann, wenn gerade ein Wechsel zwischen zwei Codewörtern stattfindet. Die folgende Graphik demonstriert das Ablesen mit unvermeidlichen zufälligen Verschiebungen bei den einzelnen Bits:
demoeinschritt(0:59); % nicht-einschrittiger Code
demoeinschritt(einschritt(60)); % einschrittiger Code
Einschrittige Codes der Länge n werden entweder durch Finden eines nicht unterbrochenen Weges der Länge n in einem KV-Diagramm entworfen
(z.Zt. demonstriert mit OH-Folien oder an der Tafel)
oder rekursiv:
Hat der Code nur 2 Codewörter, so sind dies die Bits 0 und 1 . Andernfalls
generiert man einen einschrittigen Code C der Länge ceil(n/2) . Den ersten
Teil des gesuchten Codes erhält man durch Verlängerung der Codewörter von C
durch eine 0 , den zweiten durch Anfügung einer 1 an den in umgekehrter
Reihenfolge notierten Code C .
openbyextension('einschritt.m')
Ein einschrittiger Code mit 12 Wörtern ist z.B. der folgende
binmatout(num2binmat(einschritt( 12 )',ceil(log2( 12 ))))
Die beiden Gray-Codes in der Tabelle zur Codierung der Dezimalziffern sind einschrittig.
Unterscheiden sich auch das erste und das letzte Codewort eines einschrittigen Codes nur in einem Bit, so liegt ein zyklisch einschrittiger Code vor. Die mit der Funktion einschritt(n) rekursiv generierten einschrittigen Codes sind zyklisch einschrittig, wenn n gerade ist. Zyklisch einschrittige Codes werden z.B. bei binärer Winkelcodierung benötigt.
Codes variabler Länge
Bei der seriellen Übertragung können die Codewörter eines Blockcodes einfach aneinandergehängt (concateniert) werden. Wegen der festen Länge der Codewörter sind diese später wieder zu rekonstruieren, sofern kein Bit verlorengeht.
Die Zerlegung einer unstrukturierten Bitsequenz in Codewörter ist auch möglich, wenn die Codewörter unterschiedliche Länge haben. Eine hinreichende Bedingung dafür ist die Fano-Bedingung : Kein Codewort ist identisch mit dem Anfang eines anderen Codewortes.
Als Beispiel nehmen wir den einfachsten Fall eines binären Fano-Codes, bei dem drei
Symbole codiert werden in die Codewörter 1 ; 01 ; 00 . Als Symbole nehmen
wir der Reihe nach die Symbole "Punkt" ; "Strich" und "Zeichentrennung" des
Morsecodes. Damit kann nun jeder Text aus dem Alphabet
"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-?/"
zunächst nach Morse codiert und anschließend mit obigem Fano-Code binär umcodiert
werden.
Zur Umcodierung von ASCII nach Morse nehmen wir die Funktion str2morse :
str2morse('HALLO')
Und zur Umcodierung dieses Strings in den oben genannten speziellen Fano-Code die Funktion
morse2bits( str2morse( 'HALLO' ));
Die Umkehrung erfolgt mit
morsebits2text( morse2bits( str2morse( 'HALLO' ) ) )
Im Gegensatz zum Blockcode gelingt das Zerlegen der Bitsequenz in Codewörter in diesem Fall auch dann sicher, wenn Bits verloren gehen oder eingefügt werden. Bei der folgenden Demonstration wird der korrekten Bitsequenz eine zufällige Anzahl von 0...n-1 zufälliger Bits vorangestellt. Dann wird dieser Bitvektor dekodiert um zu zeigen, dass der Code auch nach beliebigen Fehlern sofort wieder dekodiert werden kann. Zum Vergleich wird das selbe mit der ASCII-Codierung durchgeführt. In diesem Fall gelingt das Lesen nur, wenn die Anzahl der eingefügten Bits ein Vielfaches von 8 ist.
demomorserobust
Das automatische Decodieren realer tönender Morsesignale ist ein Problem der Nachrichtentechnik, das hier nicht behandelt wird.
morsesound('INFORMATIK',120,660,2000);