decode static method

Uint8List decode(
  1. String base32, {
  2. Encoding encoding = Encoding.standardRFC4648,
})

Takes in a base32 string and decodes it back to a Uint8List that can be converted to a hex string using hexEncode

Implementation

static Uint8List decode(String base32,
    {Encoding encoding = Encoding.standardRFC4648}) {
  if (base32.isEmpty) {
    return Uint8List(0);
  }

  base32 = _pad(base32, encoding: encoding);

  if (!_isValid(base32, encoding: encoding)) {
    throw FormatException('Invalid Base32 characters');
  }

  if (encoding == Encoding.crockford) {
    base32 = base32.replaceAll('-', '');
  } // Handle crockford dashes.

  var base32Decode = EncodingUtils.getDecodeMap(encoding);
  var length = base32.indexOf('=');
  if (length == -1) {
    length = base32.length;
  }

  var i = 0;
  var count = length >> 3 << 3;
  var bytes = <int>[];
  while (i < count) {
    var v1 = base32Decode[base32[i++]] ?? 0;
    var v2 = base32Decode[base32[i++]] ?? 0;
    var v3 = base32Decode[base32[i++]] ?? 0;
    var v4 = base32Decode[base32[i++]] ?? 0;
    var v5 = base32Decode[base32[i++]] ?? 0;
    var v6 = base32Decode[base32[i++]] ?? 0;
    var v7 = base32Decode[base32[i++]] ?? 0;
    var v8 = base32Decode[base32[i++]] ?? 0;
    bytes.add((v1 << 3 | v2 >> 2) & 255);
    bytes.add((v2 << 6 | v3 << 1 | v4 >> 4) & 255);
    bytes.add((v4 << 4 | v5 >> 1) & 255);
    bytes.add((v5 << 7 | v6 << 2 | v7 >> 3) & 255);
    bytes.add((v7 << 5 | v8) & 255);
  }

  var remain = length - count;
  if (remain == 2) {
    var v1 = base32Decode[base32[i++]] ?? 0;
    var v2 = base32Decode[base32[i++]] ?? 0;
    bytes.add((v1 << 3 | v2 >> 2) & 255);
  } else if (remain == 4) {
    var v1 = base32Decode[base32[i++]] ?? 0;
    var v2 = base32Decode[base32[i++]] ?? 0;
    var v3 = base32Decode[base32[i++]] ?? 0;
    var v4 = base32Decode[base32[i++]] ?? 0;
    bytes.add((v1 << 3 | v2 >> 2) & 255);
    bytes.add((v2 << 6 | v3 << 1 | v4 >> 4) & 255);
  } else if (remain == 5) {
    var v1 = base32Decode[base32[i++]] ?? 0;
    var v2 = base32Decode[base32[i++]] ?? 0;
    var v3 = base32Decode[base32[i++]] ?? 0;
    var v4 = base32Decode[base32[i++]] ?? 0;
    var v5 = base32Decode[base32[i++]] ?? 0;
    bytes.add((v1 << 3 | v2 >> 2) & 255);
    bytes.add((v2 << 6 | v3 << 1 | v4 >> 4) & 255);
    bytes.add((v4 << 4 | v5 >> 1) & 255);
  } else if (remain == 7) {
    var v1 = base32Decode[base32[i++]] ?? 0;
    var v2 = base32Decode[base32[i++]] ?? 0;
    var v3 = base32Decode[base32[i++]] ?? 0;
    var v4 = base32Decode[base32[i++]] ?? 0;
    var v5 = base32Decode[base32[i++]] ?? 0;
    var v6 = base32Decode[base32[i++]] ?? 0;
    var v7 = base32Decode[base32[i++]] ?? 0;
    bytes.add((v1 << 3 | v2 >> 2) & 255);
    bytes.add((v2 << 6 | v3 << 1 | v4 >> 4) & 255);
    bytes.add((v4 << 4 | v5 >> 1) & 255);
    bytes.add((v5 << 7 | v6 << 2 | v7 >> 3) & 255);
  }
  return Uint8List.fromList(bytes);
}