A Base62 encoder / decoder with support for leading zero bytes.
Normally, during the conversion of base10 (decimal) to base62, the input data is interpreted as one large number:
[0x13, 0x37] => 0x1337 => 4919
As leading zeroes do not count to the value of a number (0001337 = 1337),
they are ignored while converting the number to base62.
- This is exactly what the [
encode_num] function does. - The [
encode_data] keeps these leading zeroes.
This is achieved by prepending a 0x01 byte to the data before encoding,
thus creating a number that starts with a 1, then maybe has some zeroes and
finally some other digits (0001337 => 10001337 => (No zeroes are removed)).
The leading 0x01 is removed after the data has been decoded from bse62 back
to base10: 10001337 => 0001337
Alphabet
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
This is the same alphabet that
CyberChef
uses by default: [0-9][A-Z][a-z].
Wikipedia/Base62 suggests another
alphabet ([A-Z][a-z][0-9]) but I found that starting with numbers is more
natural as base62 is actually a number system like decimal (which is actually
base10).
Examples
Convert Data to Base62
This method will prepend 0x01 to the data before encoding it.
let data = vec!;
let encoded = encode_data;
assert_eq!
Parse Base62 to Data
This method expects a leading 0x01 in the byte array after decoding. It
removes the first byte before returning the byte array.
let encoded = "IKN";
let data = decode_data.unwrap;
assert_eq!
Convert a Number to Base62
let num = 1337;
let encoded = encode_num;
assert_eq!
Parse Base62 to Number
let num = 1337;
let encoded = encode_num;
assert_eq!