QRCode constructor
QRCode(
- String text,
- QRSize size,
- QRCorrection level
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.
Implementation
QRCode(String text, QRSize size, QRCorrection level) {
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];
}