如何在 Delphi 6 中进行 base64 编码?

4

我需要在Delphi6中将PDF文档编码为base64格式。有人能帮忙吗?

3个回答

9
您可以使用Delphi自带的EncdDecd单元。您需要使用的函数是EncodeStream。您只需要创建两个流,一个输入流和一个输出流。如果您是在处理文件,则应该创建TFileStream实例。
一旦您创建好了两个文件流,所需的全部就是:
EncodeStream(InputStream, OutputStream);

非常感谢。你非常有帮助。再次感谢你。 - user1984193
1
如果您通过字符串方式向XML文件添加内容,则将“OutputStream”设置为“TStringStream”。读取“TStringStream”的“DataString”属性。 - David Heffernan
那将完美地运作。 - David Heffernan
我看不到你的代码。我认为我回答了你提出的问题。 - David Heffernan
这不是你问的问题。我回答了你所问的问题。至于如何将文件放入XML中,我不知道。我不知道你是如何处理XML的。我不知道你有哪个XML库。如果你有其他问题,请提出。但你也应该接受这里的答案,因为这个问题已经得到了解答。 - David Heffernan
显示剩余4条评论

5
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.

1
独立解决方案加1分。Indy和JVCL非常好,但如果你还没有使用它们,就不是那么好了。 - Chris Thornton
4
即使在D6中,也没有必要自己编写程序。你可以使用EncdDecd,它甚至在古老的D6版本中都有提供。 - David Heffernan
@Stijn,为了接收单行 base64 字符串,向函数中添加布尔参数 linebrake 会很有用。 if ((i mod 57)=0) and linebrake then Result:=Result+#13#10; - Maxim Ponomarev

1
您可以使用INDYTIdEncoderMIME类来对任何文件进行编码。
据我所知,Delphi 6 中预装了 INDY 9,但建议更新您的 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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接