forked from LinusU/base32-decode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
55 lines (44 loc) · 1.19 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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
}