Как кодировать base64 в Delphi 6?
Мне нужно кодировать документ PDF в base64 в Delphi6. Может кто-нибудь мне помочь?
3 ответа
Вы можете использовать EncdDecd
Блок, который поставляется с Delphi. Функция, которая вам нужна EncodeStream
, Вам просто нужно создать два потока, один для ввода и один для вывода. Если вы работаете с файлами, то вы должны создать TFileStream
экземпляров.
После того как вы создали два файловых потока, все, что вам нужно, это:
EncodeStream(InputStream, OutputStream);
unit base64;
interface
uses Classes;
function base64encode(f:TStream):string;
implementation
const
Base64Codes:array[0..63] of char=
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
function base64encode(f:TStream):string;
const
dSize=57*100;//must be multiple of 3
var
d:array[0..dSize-1] of byte;
i,l:integer;
begin
Result:='';
l:=dSize;
while l=dSize do
begin
l:=f.Read(d[0],dSize);
i:=0;
while i<l do
begin
if i+1=l then
Result:=Result+
Base64Codes[ d[i ] shr 2]+
Base64Codes[((d[i ] and $3) shl 4)]+
'=='
else if i+2=l then
Result:=Result+
Base64Codes[ d[i ] shr 2]+
Base64Codes[((d[i ] and $3) shl 4) or (d[i+1] shr 4)]+
Base64Codes[((d[i+1] and $F) shl 2)]+
'='
else
Result:=Result+
Base64Codes[ d[i ] shr 2]+
Base64Codes[((d[i ] and $3) shl 4) or (d[i+1] shr 4)]+
Base64Codes[((d[i+1] and $F) shl 2) or (d[i+2] shr 6)]+
Base64Codes[ d[i+2] and $3F];
inc(i,3);
if ((i mod 57)=0) then Result:=Result+#13#10;
end;
end;
end;
end.
Вы можете использовать класс INDY TIdEncoderMIME для кодирования любого файла.
AFAIK, INDY 9 уже предустановлен в Delphi 6, но желательно обновить вашу версию INDY, так как INDY 10 является актуальной с множеством улучшений и исправлений ошибок по сравнению со старой INDY 9.
Ваш код может выглядеть так:
uses IdCoder, IdCoder3to4, IdCoderMIME, IdBaseComponent;
procedure TForm1.Button1Click(Sender: TObject);
var
SourceStr: TFileStream;
Encoder: TIdEncoderMIME;
begin
if OpenDialog1.Execute then
begin
SourceStr := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
try
Encoder := TIdEncoderMIME.Create(nil);
try
Memo1.Lines.Text := Encoder.Encode(SourceStr);
finally
Encoder.Free;
end;
finally
SourceStr.Free;
end;
end;
end;