/
int-encoder.js
43 lines (38 loc) · 1.01 KB
/
int-encoder.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
/*
* int-encoder
* https://github.com/alanclarke/int-encoder
* hex: 0123456789abcdef
* base64: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_
*/
var bignum = require('bignum')
var alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_'
function encode (value, base) {
value = bignum(String(value), base)
if (value.eq(0)) return alphabet[0]
var current
var result = ''
while (value.gt(0)) {
current = value.mod(alphabet.length)
result = alphabet[current] + result
value = value.sub(current).div(alphabet.length)
}
return result
}
function decode (str, base) {
var i, index
var result = bignum(0)
for (i = 0; i < str.length; i++) {
index = bignum(alphabet.indexOf(str[i]))
result = result.add(index.mul(bignum(alphabet.length).pow(str.length - 1 - i)))
}
return result.toString(base)
}
function alphabetr (val) {
if (val) alphabet = val
return alphabet
}
module.exports = {
encode: encode,
decode: decode,
alphabet: alphabetr
}