mirror of https://github.com/docker/docs.git
70 lines
1.2 KiB
Plaintext
70 lines
1.2 KiB
Plaintext
// Source: http://www.vincenzo.net/isxkb/index.php?title=Encode/Decode_Base64
|
|
const Codes64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
|
|
function Encode64(S: AnsiString): AnsiString;
|
|
var
|
|
i: Integer;
|
|
a: Integer;
|
|
x: Integer;
|
|
b: Integer;
|
|
begin
|
|
Result := '';
|
|
a := 0;
|
|
b := 0;
|
|
for i := 1 to Length(s) do
|
|
begin
|
|
x := Ord(s[i]);
|
|
b := b * 256 + x;
|
|
a := a + 8;
|
|
while (a >= 6) do
|
|
begin
|
|
a := a - 6;
|
|
x := b div (1 shl a);
|
|
b := b mod (1 shl a);
|
|
Result := Result + copy(Codes64,x + 1,1);
|
|
end;
|
|
end;
|
|
if a > 0 then
|
|
begin
|
|
x := b shl (6 - a);
|
|
Result := Result + copy(Codes64,x + 1,1);
|
|
end;
|
|
a := Length(Result) mod 4;
|
|
if a = 2 then
|
|
Result := Result + '=='
|
|
else if a = 3 then
|
|
Result := Result + '=';
|
|
|
|
end;
|
|
|
|
function Decode64(S: AnsiString): AnsiString;
|
|
var
|
|
i: Integer;
|
|
a: Integer;
|
|
x: Integer;
|
|
b: Integer;
|
|
begin
|
|
Result := '';
|
|
a := 0;
|
|
b := 0;
|
|
for i := 1 to Length(s) do
|
|
begin
|
|
x := Pos(s[i], codes64) - 1;
|
|
if x >= 0 then
|
|
begin
|
|
b := b * 64 + x;
|
|
a := a + 6;
|
|
if a >= 8 then
|
|
begin
|
|
a := a - 8;
|
|
x := b shr a;
|
|
b := b mod (1 shl a);
|
|
x := x mod 256;
|
|
Result := Result + chr(x);
|
|
end;
|
|
end
|
|
else
|
|
Exit; // finish at unknown
|
|
end;
|
|
end;
|