function fqbBase64Decode(const S: AnsiString): AnsiString; var F, L, M, P: Integer; B, OutPos: Byte; OutB: Array[1..3] of Byte; Lookup: Array[AnsiChar] of Byte; R: PAnsiChar; const Base64Charset = AnsiString('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'); begin L := Length(S); P := 0; while (L - P > 0) and (S[L - P] = '=') do Inc(P); M := L - P; if M <> 0 then begin SetLength(Result, (M * 3) div 4); FillChar(Lookup, Sizeof(Lookup), #0); for F := 0 to 63 do Lookup[Base64Charset[F + 1]] := F; R := Pointer(Result); OutPos := 0; for F := 1 to L - P do begin B := Lookup[S[F]]; case OutPos of 0 : OutB[1] := B shl 2; 1 : begin OutB[1] := OutB[1] or (B shr 4); R^ := AnsiChar(OutB[1]); Inc(R); OutB[2] := (B shl 4) and $FF end; 2 : begin OutB[2] := OutB[2] or (B shr 2); R^ := AnsiChar(OutB[2]); Inc(R); OutB[3] := (B shl 6) and $FF end; 3 : begin OutB[3] := OutB[3] or B; R^ := AnsiChar(OutB[3]); Inc(R) end end; OutPos := (OutPos + 1) mod 4 end; if (OutPos > 0) and (P = 0) then if OutB[OutPos] <> 0 then Result := Result + AnsiChar(OutB[OutPos]) end else Result := '' end;
----------------------------------------------
...