QRCode constructor
- String text,
- QRSize size,
- QRCorrection level, {
- bool modell1 = false,
Nativer QR-Befehl GS ( k fuer text.
Die Nutzlast geht als UTF-8 hinaus, nicht als Latin-1. Ein QR-Code
traegt Daten, keine Schrift: der Drucker legt die Bytes im Byte-Modus ab,
und der Bildmodus-Weg (qr-Paket, QrByte) kodiert denselben Beleg-QR
ebenfalls als UTF-8 — beide Wege ergeben damit denselben Code. Vorher
warf latin1.encode bei jedem Zeichen ueber 0xFF und riss den gesamten
Beleg mit. Fuer reines ASCII — die Form, in der RKSV-Belegdaten kommen —
ist das Ergebnis byteweise unveraendert.
Die Nutzlast wird bewusst nicht entschaerft (kein Ersatzzeichen fuer
Unbekanntes): ein veraendertes Zeichen ergaebe einen QR, der sich sauber
lesen laesst und trotzdem nicht mehr zum signierten Beleg passt. Falsche
Daten sind schlimmer als keine.
modell1 stellt den Modellwahl-Befehl GS ( k 04 00 31 41 49 00 voran.
Ohne ihn — dem Bestandsweg — waehlt der Drucker sein eigenes Modell, in
aller Regel Modell 2. Genau das koennen manche guenstigen Geraete nicht:
belegt ist eines, das unter dem Code eine "0" ausgibt — das Parameterbyte
0x30 des Druckbefehls, das es nicht als Befehl erkannt hat. Der Befehl
wird deshalb weiterhin nur gesendet, wenn er ausdruecklich verlangt ist;
ein aufgedraengtes "Modell 2 fuer alle" waere eine stille Umstellung an
jedem Bestandsgeraet.
Implementation
QRCode(String text, QRSize size, QRCorrection level, {bool modell1 = false}) {
if (modell1) {
bytes += cQrHeader.codeUnits + [0x04, 0x00, 0x31, 0x41, 0x31, 0x00];
}
bytes += cQrHeader.codeUnits + [0x03, 0x00, 0x31, 0x43] + [size.value];
bytes += cQrHeader.codeUnits + [0x03, 0x00, 0x31, 0x45] + [level.value];
final List<int> textBytes = utf8.encode(text);
if (textBytes.length > maxNutzlast) {
throw ArgumentError.value(textBytes.length, 'text',
'QR-Nutzlast ueberschreitet das Laengenfeld von GS ( k (max. $maxNutzlast Byte)');
}
// Die Laenge ist zweiteilig (pL, pH). pH stand fest auf 0x00: ab 253 Byte
// Nutzlast lief pL still ueber (Uint8List.fromList schneidet modulo 256
// ab) und der Drucker bekam ein protokollwidriges Laengenfeld.
final int n = textBytes.length + 3;
bytes += cQrHeader.codeUnits + [n & 0xFF, (n >> 8) & 0xFF, 0x31, 0x50, 0x30];
bytes += textBytes;
bytes += cQrHeader.codeUnits + [0x03, 0x00, 0x31, 0x52, 0x30];
bytes += cQrHeader.codeUnits + [0x03, 0x00, 0x31, 0x51, 0x30];
}