1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 | var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
|
9 | var ALPHABET_MAP = {}
|
10 | for(var i = 0; i < ALPHABET.length; i++) {
|
11 | ALPHABET_MAP[ALPHABET.charAt(i)] = i
|
12 | }
|
13 | var BASE = 58
|
14 |
|
15 | function encode(buffer) {
|
16 | if (buffer.length === 0) return ''
|
17 |
|
18 | var i, j, digits = [0]
|
19 | for (i = 0; i < buffer.length; i++) {
|
20 | for (j = 0; j < digits.length; j++) digits[j] <<= 8
|
21 |
|
22 | digits[0] += buffer[i]
|
23 |
|
24 | var carry = 0
|
25 | for (j = 0; j < digits.length; ++j) {
|
26 | digits[j] += carry
|
27 |
|
28 | carry = (digits[j] / BASE) | 0
|
29 | digits[j] %= BASE
|
30 | }
|
31 |
|
32 | while (carry) {
|
33 | digits.push(carry % BASE)
|
34 |
|
35 | carry = (carry / BASE) | 0
|
36 | }
|
37 | }
|
38 |
|
39 |
|
40 | for (i = 0; buffer[i] === 0 && i < buffer.length - 1; i++) digits.push(0)
|
41 |
|
42 |
|
43 | var stringOutput = ""
|
44 | for (var i = digits.length - 1; i >= 0; i--) {
|
45 | stringOutput = stringOutput + ALPHABET[digits[i]]
|
46 | }
|
47 | return stringOutput
|
48 | }
|
49 |
|
50 | function decode(string) {
|
51 | if (string.length === 0) return []
|
52 |
|
53 | var i, j, bytes = [0]
|
54 | for (i = 0; i < string.length; i++) {
|
55 | var c = string[i]
|
56 | if (!(c in ALPHABET_MAP)) throw new Error('Non-base58 character')
|
57 |
|
58 | for (j = 0; j < bytes.length; j++) bytes[j] *= BASE
|
59 | bytes[0] += ALPHABET_MAP[c]
|
60 |
|
61 | var carry = 0
|
62 | for (j = 0; j < bytes.length; ++j) {
|
63 | bytes[j] += carry
|
64 |
|
65 | carry = bytes[j] >> 8
|
66 | bytes[j] &= 0xff
|
67 | }
|
68 |
|
69 | while (carry) {
|
70 | bytes.push(carry & 0xff)
|
71 |
|
72 | carry >>= 8
|
73 | }
|
74 | }
|
75 |
|
76 |
|
77 | for (i = 0; string[i] === '1' && i < string.length - 1; i++) bytes.push(0)
|
78 |
|
79 | return bytes.reverse()
|
80 | }
|
81 |
|
82 | module.exports = {
|
83 | encode: encode,
|
84 | decode: decode
|
85 | }
|