unit
untComBase64;
interface
uses
SysUtils;
function
encode64(s:
string
):
string
;
function
decode64(s:
string
):
string
;
implementation
const
tabChar =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
;
function
encode64(s:
string
):
string
;
var
i :
Integer
;
charCode:
Integer
;
valToDec:
Integer
;
nbrBits :
Integer
;
charPos :
Integer
;
begin
Result :=
''
;
charCode :=
0
;
nbrBits :=
0
;
valToDec :=
0
;
for
i :=
1
to
Length(s)
do
begin
charCode := Ord(s[i]);
nbrBits := nbrBits +
16
;
valToDec := (valToDec
shl
16
) + charCode;
while
(nbrBits -
6
) >=
0
do
begin
nbrBits := nbrBits -
6
;
charPos := valToDec
shr
nbrBits;
valToDec := valToDec - (charPos
shl
nbrBits);
Result := Result + tabChar[charPos +
1
];
end
;
end
;
if
nbrBits >
0
then
begin
charPos := valToDec
shl
(
6
- nbrBits);
Result := Result + tabChar[charPos +
1
];
for
i :=
1
to
(
6
- nbrBits)
div
2
do
Result := Result +
'='
;
end
;
end
;
function
decode64(s:
string
):
string
;
var
i :
Integer
;
charPos :
Integer
;
valToDec:
Integer
;
nbrBits :
Integer
;
charCode:
Integer
;
quitLoop:
Boolean
;
begin
Result :=
''
;
nbrBits :=
0
;
valToDec :=
0
;
quitLoop :=
False
;
for
i :=
1
to
Length(s)
do
begin
charPos := Pos(s[i], tabChar) -
1
;
nbrBits := nbrBits +
6
;
valToDec := (valToDec
shl
6
) + charPos;
if
(i +
1
<= Length(s))
and
(s[i+
1
] =
'='
)
then
begin
valToDec := valToDec
shr
2
;
nbrBits := nbrBits -
2
;
if
(i +
2
<= Length(s))
and
(s[i+
2
] =
'='
)
then
begin
valToDec := valToDec
shr
2
;
nbrBits := nbrBits -
2
;
end
;
quitLoop :=
True
;
end
;
if
(nbrBits -
16
) >=
0
then
begin
nbrBits := nbrBits -
16
;
charCode := valToDec
shr
nbrBits;
valToDec := valToDec - (charCode
shl
nbrBits);
Result := Result +
Char
(charCode);
end
;
if
quitLoop
then
Break;
end
;
if
nbrBits >
0
then
Result:=
''
;
end
;
end
.