decode static method
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);
}