-
Notifications
You must be signed in to change notification settings - Fork 2
/
base64.usp
110 lines (94 loc) · 2.51 KB
/
base64.usp
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*
Dealer Name: RBSystems
Programmer: Alex M. aka Ale4ko
Email: alex@rbsystems.co.il
Tel: 0545807065
Version: 1.1
*/
#SYMBOL_NAME "base64"
#CATEGORY "10" // Serial
#HINT "base64"
#DEFINE_CONSTANT CHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
#DEFAULT_VOLATILE
#ENCODING_ASCII
//#ENABLE_TRACE
STRING_INPUT FromBase64[255];
STRING_INPUT ToBase64[255];
STRING_OUTPUT decode;
STRING_OUTPUT encode;
INTEGER CODES[255];
STRING_FUNCTION getChar(SIGNED_INTEGER int)
{
if (int >= 0)
{
return(mid(CHARS, int + 1, 1));
}
else
{
return("");
}
}
STRING_FUNCTION base64_decode(STRING input)
{
SIGNED_INTEGER enc1,enc2,enc3,enc4;
SIGNED_INTEGER chr1,chr2,chr3;
STRING result[255];
INTEGER n;
result = "";
for (n = 1 to len(input) step 4)
{
enc1 = CODES[ Byte( input, n ) ];
enc2 = CODES[ Byte( input, n+1 ) ];
enc3 = CODES[ Byte( input, n+2 ) ];
enc4 = CODES[ Byte( input, n+3 ) ];
//Trace("enc1=%d enc2=%d enc3=%d enc4=%d\n", enc1, enc2, enc3, enc4);
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
result = result + chr(chr1);
if (enc3 != 64) {
result = result + chr(chr2);
}
if (enc4 != 64) {
result = result + chr(chr3);
}
}
return(result);
}
STRING_FUNCTION base64_encode(STRING input)
{
SIGNED_INTEGER enc1,enc2,enc3,enc4;
SIGNED_INTEGER chr1,chr2,chr3;
STRING result[255];
INTEGER n;
result = "";
for (n = 1 to len(input) step 3)
{
chr1 = byte(input, n);
chr2 = byte(input, n+1);
chr3 = byte(input, n+2);
if(chr2=-1){chr2=0;}
if(chr3=-1){chr3=0;}
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if(chr2=0){ enc3 = 64; enc4 = 64;}
else if(chr3=0){ enc4 = 64; }
result = result + getChar(enc1) + getChar(enc2) + getChar(enc3) + getChar(enc4);
}
return(result);
}
CHANGE FromBase64
{
decode = base64_decode(FromBase64);
}
CHANGE ToBase64
{
encode = base64_encode(ToBase64);
}
Function Main() {
INTEGER i;
SetArray( CODES, 255 );
for( i=1 to Len(CHARS) ) CODES[ Byte(CHARS,i) ] = i-1;
}