decode static method

UQrDecodeResult decode(
  1. Uint8List bytes,
  2. UQrVersion version,
  3. UQrEcLevel level
)

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,
  );
}