Pascal: Valakinek van normál statikus megvalósítása ennek a kódolási algoritmusnak? Szeretném megérteni, de a dinamikus változókat sose értettem.
Normál statikus változókkal érdekelne ez a Base64 kódolási algoritmus...
Nem értem hogy a Windows unit-ot is miért hívja be, nem grafikus alkalmazás...
unit Base64;
interface
uses windows;
{ Base64 encode and decode a string }
function BASE64Encode(src:pByte;len:integer):PAnsiChar;
function BASE64Decode(src:PAnsiChar;var dst:pByte):integer;
{******************************************************************************}
{******************************************************************************}
implementation
uses common;
const
base64chars{:array [0..63] of AnsiChar}:PAnsiChar =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
function BASE64Encode(src:pByte;len:integer):PAnsiChar;
var
dst:PAnsiChar;
begin
if (src=nil) or (len<=0) then
begin
result:=nil;
exit;
end;
mGetMem(result,((len*4+11) div (12*4))+1);
dst:=result;
while len>0 do
begin
dst^:=base64chars[src^ shr 2]; inc(dst);
if len=1 then
begin
dst^:=base64chars[(src^ and 3) shl 4]; inc(dst);
dst^:='='; inc(dst);
dst^:='='; inc(dst);
break;
end;
dst^:=base64chars[((src^ and 3) shl 4) or (pbyte(PAnsiChar(src)+1)^ shr 4)]; inc(dst); inc(src);
if len=2 then
begin
dst^:=base64chars[(src^ and $F) shl 2]; inc(dst);
dst^:='='; inc(dst);
break;
end;
dst^:=base64chars[((src^ and $F) shl 2) or (pbyte(PAnsiChar(src)+1)^ shr 6)]; inc(dst); inc(src);
dst^:=base64chars[src^ and $3F]; inc(dst); inc(src);
dec(len,3);
end;
dst^:=#0;
end;
function Base64CharToInt(c:AnsiChar):byte;
begin
case c of
'A'..'Z': result:=ord(c)-ord('A');
'a'..'z': result:=ord(c)-ord('a')+26;
'0'..'9': result:=ord(c)-ord('0')+52;
'+': result:=62;
'/': result:=63;
'=': result:=64;
else
result:=255;
end;
end;
function BASE64Decode(src:PAnsiChar;var dst:pByte):integer;
var
slen:integer;
ptr:pByte;
b1,b2,b3,b4:byte;
begin
if (src=nil) or (src^=#0) then
begin
result:=0;
dst:=nil;
exit;
end;
pAnsiChar(ptr):=src;
while ptr^<>0 do inc(ptr);
slen:=PAnsiChar(ptr)-src;
mGetMem(ptr,(slen*3) div 4);
dst:=ptr;
result:=0;
while slen>0 do
begin
b1:=Base64CharToInt(src^); inc(src);
b2:=Base64CharToInt(src^); inc(src);
b3:=Base64CharToInt(src^); inc(src);
b4:=Base64CharToInt(src^); inc(src);
dec(slen,4);
if (b1=255) or (b1=64) or (b2=255) or (b2=64) or (b3=255) or (b4=255) then
break;
ptr^:=(b1 shl 2) or (b2 shr 4); inc(ptr); inc(result);
if b3=64 then
break;
ptr^:=(b2 shl 4) or (b3 shr 2); inc(ptr); inc(result);
if b4=64 then
break;
ptr^:=b4 or (b3 shl 6); inc(ptr); inc(result);
end;
end;
end.
Köszönöm szépen.
Én más keresőszóval kerestem és azért csak ezt a fentebbi algoritmust dobta ki.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!