213 lines
6.1 KiB
Plaintext
213 lines
6.1 KiB
Plaintext
unit base64;
|
|
|
|
interface
|
|
|
|
function base64decode(instr : string): string;
|
|
function base64encode(instr : string) : string;
|
|
|
|
implementation
|
|
|
|
uses
|
|
SysUtils,classes;
|
|
|
|
function base64decode(instr : string) : string;
|
|
var
|
|
inidx ,len: integer;
|
|
outstr : String;
|
|
in1, in2, in3, in4 : char;
|
|
v1, v2, v3, v4 : integer;
|
|
out1, out2, out3 : char;
|
|
|
|
function ct(inchar : char) : integer;
|
|
begin
|
|
ct := 0;
|
|
case inchar of
|
|
'A' : ct := 0 ; 'B' : ct := 1 ; 'C' : ct := 2 ; 'D' : ct := 3 ;
|
|
'E' : ct := 4 ; 'F' : ct := 5 ; 'G' : ct := 6 ; 'H' : ct := 7 ;
|
|
'I' : ct := 8 ; 'J' : ct := 9 ; 'K' : ct := 10 ; 'L' : ct := 11 ;
|
|
'M' : ct := 12 ; 'N' : ct := 13 ; 'O' : ct := 14 ; 'P' : ct := 15 ;
|
|
'Q' : ct := 16 ; 'R' : ct := 17 ; 'S' : ct := 18 ; 'T' : ct := 19 ;
|
|
'U' : ct := 20 ; 'V' : ct := 21 ; 'W' : ct := 22 ; 'X' : ct := 23 ;
|
|
'Y' : ct := 24 ; 'Z' : ct := 25 ; 'a' : ct := 26 ; 'b' : ct := 27 ;
|
|
'c' : ct := 28 ; 'd' : ct := 29 ; 'e' : ct := 30 ; 'f' : ct := 31 ;
|
|
'g' : ct := 32 ; 'h' : ct := 33 ; 'i' : ct := 34 ; 'j' : ct := 35 ;
|
|
'k' : ct := 36 ; 'l' : ct := 37 ; 'm' : ct := 38 ; 'n' : ct := 39 ;
|
|
'o' : ct := 40 ; 'p' : ct := 41 ; 'q' : ct := 42 ; 'r' : ct := 43 ;
|
|
's' : ct := 44 ; 't' : ct := 45 ; 'u' : ct := 46 ; 'v' : ct := 47 ;
|
|
'w' : ct := 48 ; 'x' : ct := 49 ; 'y' : ct := 50 ; 'z' : ct := 51 ;
|
|
'0' : ct := 52 ; '1' : ct := 53 ; '2' : ct := 54 ; '3' : ct := 55 ;
|
|
'4' : ct := 56 ; '5' : ct := 57 ; '6' : ct := 58 ; '7' : ct := 59 ;
|
|
'8' : ct := 60 ; '9' : ct := 61 ; '+' : ct := 62 ; '/' : ct := 63 ;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
try
|
|
inidx := 1;
|
|
len := Length ( instr);
|
|
outstr := '';
|
|
while inidx < len do
|
|
begin
|
|
in1 := instr[inidx];
|
|
inc(inidx);
|
|
in2 := instr[inidx];
|
|
inc(inidx);
|
|
in3 := instr[inidx];
|
|
inc(inidx);
|
|
in4 := instr[inidx];
|
|
inc(inidx);
|
|
|
|
if instr[inidx] = #13 then
|
|
begin
|
|
inidx := inidx+2;
|
|
end;
|
|
|
|
v1 := ct(in1);
|
|
v2 := ct(in2);
|
|
v3 := ct(in3);
|
|
v4 := ct(in4);
|
|
|
|
if ((in3 = '=') and (in4 = '=')) then
|
|
begin
|
|
out1 := chr((v1 shl 2)+(v2 shr 4));
|
|
outstr := concat(outstr,out1);
|
|
break;
|
|
end
|
|
else if ((in3 <> '=') and (in4 = '=')) then
|
|
begin
|
|
out1 := chr((v1 shl 2)+(v2 shr 4));
|
|
out2 := chr((v2 shl 4)+(v3 shr 2));
|
|
outstr := concat(outstr,out1);
|
|
outstr := concat(outstr,out2);
|
|
break;
|
|
end
|
|
else
|
|
begin
|
|
out1 := chr((v1 shl 2)+(v2 shr 4));
|
|
out2 := chr((v2 shl 4)+(v3 shr 2));
|
|
out3 := chr((v3 shl 6)+v4);
|
|
outstr := concat(outstr,out1);
|
|
outstr := concat(outstr,out2);
|
|
outstr := concat(outstr,out3);
|
|
end;
|
|
end;
|
|
finally
|
|
result := outstr;
|
|
end;
|
|
end;
|
|
|
|
function base64encode(instr : string): string;
|
|
var
|
|
inidx,len : integer;
|
|
outstr : String;
|
|
nsize : longInt;
|
|
in1, in2, in3, t : char;
|
|
out1, out2, out3, out4 : integer;
|
|
index, final : integer;
|
|
tmpstr : String;
|
|
|
|
function ct(inchar : integer) : char;
|
|
begin
|
|
ct := ' ';
|
|
case inchar of
|
|
0 : ct := 'A' ; 1 : ct := 'B' ; 2 : ct := 'C' ; 3 : ct := 'D' ;
|
|
4 : ct := 'E' ; 5 : ct := 'F' ; 6 : ct := 'G' ; 7 : ct := 'H' ;
|
|
8 : ct := 'I' ; 9 : ct := 'J' ; 10 : ct := 'K' ; 11 : ct := 'L' ;
|
|
12 : ct := 'M' ; 13 : ct := 'N' ; 14 : ct := 'O' ; 15 : ct := 'P' ;
|
|
16 : ct := 'Q' ; 17 : ct := 'R' ; 18 : ct := 'S' ; 19 : ct := 'T' ;
|
|
20 : ct := 'U' ; 21 : ct := 'V' ; 22 : ct := 'W' ; 23 : ct := 'X' ;
|
|
24 : ct := 'Y' ; 25 : ct := 'Z' ; 26 : ct := 'a' ; 27 : ct := 'b' ;
|
|
28 : ct := 'c' ; 29 : ct := 'd' ; 30 : ct := 'e' ; 31 : ct := 'f' ;
|
|
32 : ct := 'g' ; 33 : ct := 'h' ; 34 : ct := 'i' ; 35 : ct := 'j' ;
|
|
36 : ct := 'k' ; 37 : ct := 'l' ; 38 : ct := 'm' ; 39 : ct := 'n' ;
|
|
40 : ct := 'o' ; 41 : ct := 'p' ; 42 : ct := 'q' ; 43 : ct := 'r' ;
|
|
44 : ct := 's' ; 45 : ct := 't' ; 46 : ct := 'u' ; 47 : ct := 'v' ;
|
|
48 : ct := 'w' ; 49 : ct := 'x' ; 50 : ct := 'y' ; 51 : ct := 'z' ;
|
|
52 : ct := '0' ; 53 : ct := '1' ; 54 : ct := '2' ; 55 : ct := '3' ;
|
|
56 : ct := '4' ; 57 : ct := '5' ; 58 : ct := '6' ; 59 : ct := '7' ;
|
|
60 : ct := '8' ; 61 : ct := '9' ; 62 : ct := '+' ; 63 : ct := '/' ;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
outstr := '';
|
|
try
|
|
inidx := 1;
|
|
len := length(instr);
|
|
nsize := 0;
|
|
index := 0;
|
|
|
|
while (nsize < len) do
|
|
begin
|
|
inc(nsize);
|
|
in1 := instr[inidx];
|
|
inc(inidx);
|
|
final := 8;
|
|
if (nsize < len) then
|
|
begin
|
|
inc(nsize);
|
|
in2 := instr[inidx];
|
|
inc(inidx);
|
|
|
|
final := 16;
|
|
end
|
|
else in2 := chr(0);
|
|
|
|
if (nsize < len) then
|
|
begin
|
|
inc(nsize);
|
|
in3 := instr[inidx];
|
|
inc(inidx);
|
|
|
|
final := 24;
|
|
end
|
|
else in3 := chr(0);
|
|
|
|
out1 := ord(in1) shr 2;
|
|
out2 := ((ord(in1) and 3) shl 4) + (ord(in2) shr 4);
|
|
out3 := ((ord(in2) and 15) shl 2) + ((ord(in3) and 192) shr 6);
|
|
out4 := ord(in3) and 63;
|
|
|
|
t := ct(out1);
|
|
inc(index);
|
|
outstr := concat(outstr,t);
|
|
|
|
t := ct(out2);
|
|
inc(index);
|
|
outstr := concat(outstr,t);
|
|
|
|
if ((final = 8) and (nsize = len)) then
|
|
begin
|
|
tmpstr := '=='+#$D+#$A;
|
|
outstr := concat(outstr,tmpstr);
|
|
break;
|
|
end;
|
|
t := ct(out3);
|
|
inc(index);
|
|
outstr := concat(outstr,t);
|
|
|
|
if ((final = 16) and (nsize = len)) then
|
|
begin
|
|
tmpstr := '='+#$D+#$A;
|
|
outstr := concat(outstr,tmpstr);
|
|
break;
|
|
end;
|
|
|
|
t := ct(out4);
|
|
inc(index);
|
|
outstr := concat(outstr,t);
|
|
if index = 72 then
|
|
begin
|
|
tmpstr := #$D+#$A;
|
|
outstr := concat(outstr,tmpstr);
|
|
index := 0;
|
|
end;
|
|
|
|
end;
|
|
finally
|
|
result := outstr;
|
|
end;
|
|
end;
|
|
|
|
end.
|