Line data Source code
1 : import 'dart:typed_data';
2 :
3 : class Base32 {
4 : static const CHARSET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l';
5 :
6 12 : static final Map<String, int> CHARSET_INVERSE_INDEX = {
7 : 'q': 0,
8 : 'p': 1,
9 : 'z': 2,
10 : 'r': 3,
11 : 'y': 4,
12 : '9': 5,
13 : 'x': 6,
14 : '8': 7,
15 : 'g': 8,
16 : 'f': 9,
17 : '2': 10,
18 : 't': 11,
19 : 'v': 12,
20 : 'd': 13,
21 : 'w': 14,
22 : '0': 15,
23 : 's': 16,
24 : '3': 17,
25 : 'j': 18,
26 : 'n': 19,
27 : '5': 20,
28 : '4': 21,
29 : 'k': 22,
30 : 'h': 23,
31 : 'c': 24,
32 : 'e': 25,
33 : '6': 26,
34 : 'm': 27,
35 : 'u': 28,
36 : 'a': 29,
37 : '7': 30,
38 : 'l': 31,
39 : };
40 :
41 : /// Encodes the given list of 5-bit integers as a base32-encoded string.
42 3 : String encode(Uint8List data) {
43 : String base32 = '';
44 9 : for (var i = 0; i < data.length; ++i) {
45 3 : var value = data[i];
46 6 : if (value < 0 || value >= 32) {
47 0 : throw FormatException('Invalid value: $value.');
48 : }
49 6 : base32 += CHARSET[value];
50 : }
51 : return base32;
52 : }
53 :
54 : /// Decodes the given base32-encoded string into a list of 5-bit integers.
55 4 : Uint8List decode(String string) {
56 8 : final data = Uint8List(string.length);
57 12 : for (var i = 0; i < string.length; ++i) {
58 4 : var value = string[i];
59 8 : if (!CHARSET_INVERSE_INDEX.containsKey(value)) {
60 0 : throw FormatException('Invalid value: $value.');
61 : }
62 12 : data[i] = CHARSET_INVERSE_INDEX[value]!;
63 : }
64 : return data;
65 : }
66 : }
|