decode static method
Implementation
static UQrDecodeResult decode(Uint8List bytes, UQrVersion version, UQrEcLevel level) {
final UBitSource bits = UBitSource(bytes);
final StringBuffer result = StringBuffer();
final List<int> byteSegments = <int>[];
int? eci;
UCodeStructuredAppend? structuredAppend;
int symbologyModifier = 1;
bool fnc1 = false;
bool utf8Hint = false;
while (bits.available >= 4) {
final int mode = bits.readBits(4);
if (mode == 0) break;
switch (mode) {
case 0x05:
fnc1 = true;
symbologyModifier = 3;
break;
case 0x09:
if (bits.available < 8) break;
bits.readBits(8);
fnc1 = true;
symbologyModifier = 5;
break;
case 0x03:
if (bits.available < 16) throw const UCodeDecodeException("Truncated structured append");
final int symbolSequence = bits.readBits(8);
final int parity = bits.readBits(8);
structuredAppend = UCodeStructuredAppend(index: symbolSequence >> 4, total: (symbolSequence & 0x0F) + 1, parity: parity);
break;
case 0x07:
final int value = _parseEci(bits);
if (value < 0 || value > 999999) throw const UCodeDecodeException("Bad ECI value");
eci = value;
utf8Hint = value == 26;
break;
case 0x01:
_decodeNumeric(bits, result, bits.readBits(_characterCountBits(mode, version)));
break;
case 0x02:
_decodeAlphanumeric(bits, result, bits.readBits(_characterCountBits(mode, version)), fnc1);
break;
case 0x04:
_decodeByte(bits, result, byteSegments, bits.readBits(_characterCountBits(mode, version)), eci, utf8Hint);
break;
case 0x08:
_decodeKanji(bits, result, bits.readBits(_characterCountBits(mode, version)));
break;
default:
throw const UCodeDecodeException("Unsupported QR mode");
}
}
final String text = result.toString();
return UQrDecodeResult(
text: text,
bytes: byteSegments.isNotEmpty ? Uint8List.fromList(byteSegments) : Uint8List.fromList(utf8.encode(text)),
eci: eci,
structuredAppend: structuredAppend,
symbologyModifier: symbologyModifier,
);
}