UNPKG

base32-decode

Version:

Base32 decoder with support for multiple variants.

56 lines (44 loc) 1.22 kB
var RFC4648 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567' var RFC4648_HEX = '0123456789ABCDEFGHIJKLMNOPQRSTUV' var CROCKFORD = '0123456789ABCDEFGHJKMNPQRSTVWXYZ' function readChar (alphabet, char) { var idx = alphabet.indexOf(char) if (idx === -1) { throw new Error('Invalid character found: ' + char) } return idx } module.exports = function base32Decode (input, variant) { var alphabet switch (variant) { case 'RFC3548': case 'RFC4648': alphabet = RFC4648 input = input.replace(/=+$/, '') break case 'RFC4648-HEX': alphabet = RFC4648_HEX input = input.replace(/=+$/, '') break case 'Crockford': alphabet = CROCKFORD input = input.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1') break default: throw new Error('Unknown base32 variant: ' + variant) } var length = input.length var bits = 0 var value = 0 var index = 0 var output = new Uint8Array((length * 5 / 8) | 0) for (var i = 0; i < length; i++) { value = (value << 5) | readChar(alphabet, input[i]) bits += 5 if (bits >= 8) { output[index++] = (value >>> (bits - 8)) & 255 bits -= 8 } } return output.buffer }