Datamatrix Codes sind wie auch die eventuell bereits bekannten QR-Codes zweidimensionale Barcodes die vor allem in der Industrie eingesetzt werden. Er verwendet den Reed-Solomon-Algorithmus zur Fehlerkorrektur. In der üblichen Umsetzung können bis zu 25% der Daten fehlerhaft sein und der Code kann immer noch ausgelesen werden.
Um den Cache zu finden müsst Ihr lediglich die Inhalte der folgenden zwei Barcodes „verstehen“. Über den ersten ist wohl etwas Kaffee gelaufen, aber das wichtigste ist noch lesbar. Beim zweiten lernt man was über die Fähigkeiten der Fehlerkorrektur. Im Sommer ist der Outdoorteil etwas stachelig.
Informationen zum Aufbau des Codes
Die folgende Beschreibung geht nur auf die zum lösen des Rätsels notwendigen Teile der Spezifikation von Datamatrix-Codes ein.
Geometrie
Geometrisch betrachtet besteht der Code aus vier Bereichen:
- Innen; schwarz weiß; der Datenbereich. Hier sind die Informationen (der Codeinhalt) enthalten
- Unten links; rot; das „finder pattern“. Ein L mit dem ein Barcodeleser die Orientierung des Codes erkennen kann
- Oben rechts; grün weiß; das „frequency pattern“. Durch die Abfolge von schwarzen (nur hier grün) und weißen Flächen kann der Barcodeleser die Größe der einzelnen Bereiche erkennen
- Ganz außen, gelb, die Ruhezone. Sie wird benötigt um den Barcode von der Umgebung abzugrenzen.
|
 |
Datenanordnung
| Die einzelnen Codeworte (rot umrandet) sind jeweils in einem 3x3 Module großen Quadrat dem die obere rechte Ecke fehlt enthalten. Die Anordnung der Codeworte erfolgt in einem Zick-Zack-Muster von links oben nach rechts unten. Wenn ein Codewort über den Rand hinausläuft wird es an der gegenüberliegenden Seite ergänzt (hier bei Codewort 1, 3, 4, 7). Je nach Größe des Barcodes gibt es in den Ecken spezielle Anordungen (hier bei Codewort 8). Wenn die Zahl der Module nicht durch 8 teilbar ist bleibt unten rechts noch ein Rest der nicht verwendet wird (gelbe Fläche). |
 |
Anordnung in einem Codewort
| Innerhalb eines Codeworts sind die einzelnen Bits vom höchstwertigen zum niedrigstwertigen in Zeilen von links nach rechts angeordnet. Ein schwarzes Modul repräsentiert eine binäre 1 ein weißes eine 0. Im Bild entspricht dies 11101111 in binärer Darstellung (oder 239 dezimal). |
 |
Ränder
| An den Rändern werden die Codeworte „umgebrochen“. Je nach Größe des Barcodes kann es auch noch zusätzlich einen Versatz geben. |
 |
Ecken
| Je nach Größe des Barcodes geht das Muster in den Ecken nicht auf. In diesen Fällen wird das Codewort entsprechend einer der nebenstehenden Abbildungen angeordnet. |
 |
Fehlerkorrektur
Im Datamatrix-Code werden zusätzlich zum eigentlichen Codeinhalt noch weitere Codeworte angehängt mit deren Hilfe Lesefehler (oder auch Schreibfehler) korrigiert werden (Reed-Solomon-Algorithmus). Wie genau die Fehler erkannt und behoben werden, soll hier keine Rolle spielen (komplizierte Mathematik). Wichtig ist nur folgendes:
- Zum eigentlichen Inhalt werden weitere Codeworte berechnet und angehängt.
- Beim auslesen des Barcodes können mit Hilfe dieser weiteren Codeworte Fehler erkannt und behoben werden.
Interpretation der Rohdaten
Die Nutzdaten können auf verschiedene Arten in den Rohdaten enthalten sein. Dadurch ist es möglich die Nutzdaten etwas zu komprimieren.
| Zeichensatz |
Darstellbare Zeichen |
Zeichen pro Codewort |
| ASCII |
ASCII Zeichen 0 bis 127 |
1 |
| Erweiterter ASCII Satz |
ASCII Zeichen 128 bis 255 |
0,5 |
| ASCII numerisch |
Zahlen von 0 bis 99 |
2 |
| C40 |
Großbuchstaben und Ziffern |
1,5 |
| Text |
Kleinbuchstaben und Ziffern |
1,5 |
| X12 |
ANSI X12 Zeichen |
1,5 |
| EDIFACT |
ASCII Zeichen 32 bis 94 |
1,33 |
| BASE 256 |
Alle ASCII Zeichen |
1 |
Am Codeanfang ist der Modus immer ASCII. Spezielle Codeworte markieren Spezialfunktionen oder schalten zwischen den Nutzdatendarstellungen um.
| Codewort (dez / hex) |
Wert oder Funktion |
| 0 / 0 |
Nicht verwendet |
| 1 bis 128 / 1 bis 80 |
ASCII Zeichen (0-127) |
| 129 / 81 |
Füllzeichen (Wenn zwischen Nutzdaten und Fehlerkorrektur noch Platz sein sollte) |
| 130 bis 229 / 82 bis E5 |
Zahlen 00 bis 99 |
| 230 / E6 |
Umschalten zu C40 |
| 231 / E7 |
Umschalten zu Base 256 |
| 232 / E8 |
FNC1 Zeichen |
| 233 / E9 |
„Structured append“ |
| 234 / EA |
Spezialfunktion zur Programmierung von Barcodelesern |
| 235 / EB |
Nächstes Zeichen ist aus dem erweiterten ASCII Satz |
| 236 / EC |
05 Macro |
| 237 / ED |
05 Macro |
| 238 / EE |
Umschalten zu ANSI X12 |
| 239 / EF |
Umschalten zu TEXT |
| 240 / F0 |
Umschalten zu EDIFACT |
| 241 / F1 |
ECI Zeichen |
| 254 / FE |
Falls ASCII Modus aktiv: „Ende der Daten“. Sonst: Zurückschalten zur ASCII Darstellung. |
ASCII Modus
Im ASCII Modus können alle Zeichen der 7-Bit ASCII Tabelle (Zeichen 0-127) codiert werden. Zum Umrechnen eines Zeichnens in ein Codewort wird zum Ordinalwert des Zeichens 1 addiert.
Bsp: Der Buchstabe 'H' hat den Ordinalwert 72(dez). Daraus ergibt sich das Codewort 73(dez).
C40
Im C40 Modus werden jeweils 3 Zeichen in zwei Codeworte gepackt. Die Zeichen aus Set 0 sind direkt codierbar. Jedem Zeichen aus den Sets 1-3 muss das entsprechende Umschaltkommando aus Set 0 (Wert 0-2) vorangestellt werden.
| Wert |
Set 0 |
Set 1 |
Set 2 |
Set 3 |
| 0 |
set 1 |
NUL |
! |
' |
| 1 |
set 2 |
SOH |
" |
a |
| 2 |
set 3 |
STX |
# |
b |
| 3 |
Leerzeichen |
ETX |
$ |
c |
| 4 |
0 |
EOT |
% |
d |
| 5 |
1 |
ENQ |
& |
e |
| 6 |
2 |
ACK |
‘ |
f |
| 7 |
3 |
BEL |
( |
g |
| 8 |
4 |
BS |
) |
h |
| 9 |
5 |
HT |
* |
i |
| 10 |
6 |
LF |
+ |
j |
| 11 |
7 |
VT |
, |
k |
| 12 |
8 |
FF |
- |
l |
| 13 |
9 |
CR |
. |
m |
| 14 |
A |
SO |
/ |
n |
| 15 |
B |
SI |
: |
o |
| 16 |
C |
DLE |
; |
p |
| 17 |
D |
DC1 |
< |
q |
| 18 |
E |
DC2 |
= |
r |
| 19 |
F |
DC3 |
> |
s |
| 20 |
G |
DC4 |
? |
t |
| 21 |
H |
NAK |
@ |
u |
| 22 |
I |
SYN |
[ |
v |
| 23 |
J |
ETB |
\ |
w |
| 24 |
K |
CAN |
] |
x |
| 25 |
L |
EM |
^ |
y |
| 26 |
M |
SUB |
_ |
z |
| 27 |
N |
ESC |
FNC1 |
{ |
| 28 |
O |
FS |
|
| |
| 29 |
P |
GS |
|
} |
| 30 |
Q |
RS |
hibit |
~ |
| 31 |
R |
US |
|
DEL |
| 32 |
S |
|
|
|
| 33 |
T |
|
|
|
| 34 |
U |
|
|
|
| 35 |
V |
|
|
|
| 36 |
W |
|
|
|
| 37 |
X |
|
|
|
| 38 |
Y |
|
|
|
| 39 |
Z |
|
|
|
Die zwei Codeworte (CW1 und CW2) ergeben sich wie folgt:
V = W1 * 1600 + W2 * 40 + W3 + 1
wobei W1-W3 die Werte der zu codierenden Zeichen sind.
CW1 = V / 256 (ganzzahlig teilen)
CW2 = V mod 256 (der Rest).
Bsp: Zu codierender Text: „2k“.
Die Ziffer „2“ ist im Set 0, der kleine Buchstabe „k“ im Set 3. D.h. dem Wert von „k“ muss noch der Wert zum Umschalten auf Set 3 vorangestellt werden.
Damit ergibt sich:
V = 6 * 1600 + 2 * 40 + 11 + 1 = 9692
CW1 = 37
CW2 = 220
Decodiert wird in umgekehrter Weise. Zwei aufeinander folgende Codeworte werden in drei Zeichen zerlegt:
V = CW1 * 256 + CW2
W1 = (V – 1) / 1600 (ganzzahlig teilen)
W2 = (V - W1 * 1600 – 1) / 40 (ganzzahlig teilen)
W3 = V - W1 * 1600 – W2 * 40 – 1
Text
Der Textmodus funktioniert genau gleich wie der C40 Modus. Er verwendet lediglich andere Tabellen für die Codierung (Groß- und Kleinbuchstaben vertauscht).
| Wert |
Set 0 |
Set 1 |
Set 2 |
Set 3 |
| 0 |
set 1 |
NUL |
! |
' |
| 1 |
set 2 |
SOH |
" |
A |
| 2 |
set 3 |
STX |
# |
B |
| 3 |
Leerzeichen |
ETX |
$ |
C |
| 4 |
0 |
EOT |
% |
D |
| 5 |
1 |
ENQ |
& |
E |
| 6 |
2 |
ACK |
‘ |
F |
| 7 |
3 |
BEL |
( |
G |
| 8 |
4 |
BS |
) |
H |
| 9 |
5 |
HT |
* |
I |
| 10 |
6 |
LF |
+ |
J |
| 11 |
7 |
VT |
, |
K |
| 12 |
8 |
FF |
- |
L |
| 13 |
9 |
CR |
. |
M |
| 14 |
a |
SO |
/ |
N |
| 15 |
b |
SI |
: |
O |
| 16 |
c |
DLE |
; |
P |
| 17 |
d |
DC1 |
< |
Q |
| 18 |
e |
DC2 |
= |
R |
| 19 |
f |
DC3 |
> |
S |
| 20 |
g |
DC4 |
? |
T |
| 21 |
h |
NAK |
@ |
U |
| 22 |
i |
SYN |
[ |
V |
| 23 |
j |
ETB |
\ |
W |
| 24 |
k |
CAN |
] |
X |
| 25 |
l |
EM |
^ |
Y |
| 26 |
m |
SUB |
_ |
Z |
| 27 |
n |
ESC |
FNC1 |
{ |
| 28 |
o |
FS |
|
| |
| 29 |
p |
GS |
|
} |
| 30 |
q |
RS |
hibit |
~ |
| 31 |
r |
US |
|
DEL |
| 32 |
s |
|
|
|
| 33 |
t |
|
|
|
| 34 |
u |
|
|
|
| 35 |
v |
|
|
|
| 36 |
w |
|
|
|
| 37 |
x |
|
|
|
| 38 |
y |
|
|
|
| 39 |
z |
|
|
|
Outdoorteil
Nachdem die ersten zwei die T-Wertung als zu niedrig eingeschätzt haben noch folgender Hinweis:
Wer die "Drive-In" Variante wählt wird mit einer um 0,5 erhöhten T-Wertung und weniger Aussicht bestraft. Alle anderen wählen den Trampelpfad der weiter im Norden von der Straße abzweigt.