Files
xrpl-hooks-ide/utils/decodeRestrictedBase64ToBytes.ts
2022-08-17 11:50:49 +05:30

120 lines
1.6 KiB
TypeScript

const base64DecodeMap = [
// starts at 0x2B
62,
0,
0,
0,
63,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
0,
0,
0,
0,
0,
0,
0, // 0x3A-0x40
0,
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,
0,
0,
0,
0,
0,
0, // 0x5B-0x0x60
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
]
const base64DecodeMapOffset = 0x2b
const base64EOF = 0x3d
export function decodeRestrictedBase64ToBytes(encoded: string) {
let ch: any
let code: any
let code2: any
const len = encoded.length
const padding = encoded.charAt(len - 2) === '=' ? 2 : encoded.charAt(len - 1) === '=' ? 1 : 0
const decoded = new Uint8Array((encoded.length >> 2) * 3 - padding)
for (let i = 0, j = 0; i < encoded.length; ) {
ch = encoded.charCodeAt(i++)
code = base64DecodeMap[ch - base64DecodeMapOffset]
ch = encoded.charCodeAt(i++)
code2 = base64DecodeMap[ch - base64DecodeMapOffset]
decoded[j++] = (code << 2) | ((code2 & 0x30) >> 4)
ch = encoded.charCodeAt(i++)
if (ch === base64EOF) {
return decoded
}
code = base64DecodeMap[ch - base64DecodeMapOffset]
decoded[j++] = ((code2 & 0x0f) << 4) | ((code & 0x3c) >> 2)
ch = encoded.charCodeAt(i++)
if (ch === base64EOF) {
return decoded
}
code2 = base64DecodeMap[ch - base64DecodeMapOffset]
decoded[j++] = ((code & 0x03) << 6) | code2
}
return decoded
}