Как кодировать 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;
Другие вопросы по тегам