【问题标题】:How to encode base64 in Delphi 6? [duplicate]如何在 Delphi 6 中编码 base64? [复制]
【发布时间】:2013-02-03 05:39:40
【问题描述】:

我需要在 Delphi6 中将 pdf 文档编码为 base64。 谁能帮帮我?

【问题讨论】:

    标签: delphi pdf encoding base64 delphi-6


    【解决方案1】:

    您可以使用 Delphi 提供的EncdDecd 单元。你需要的函数是EncodeStream。您只需要创建两个流,一个用于输入,一个用于输出。如果您正在处理文件,那么您应该创建 TFileStream 实例。

    创建两个文件流后,您只需要:

    EncodeStream(InputStream, OutputStream);
    

    【讨论】:

    • 非常感谢。你太有帮助了。再次感谢您
    • David Heffernam,你能告诉我如何查看 OutputStream 吗?我需要将此编码文件插入到 Xml 文件中
    • 如果您通过字符串添加到 XML 文件,则将 OutputStream 设为 TStringStream。读取TStringStreamDataString 属性。
    • 我尝试将 OutputStream 创建为 .txt 文件 "OutputFile:=TFileStream.Create(WOutFicheiro,fmCreate)
    • 这样就可以了。
    【解决方案2】:

    您可以使用INDYTIdEncoderMIME 类对任何文件进行编码。

    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;
    

    【讨论】:

      【解决方案3】:
      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 用于独立解决方案。 Indy 和 JVCL 很棒,但如果您还没有使用它们,那就不行了。
      • @ChrisThornton 即使在 D6 中也无需自己动手。你可以使用EncdDecd,它甚至是古老的 D6 附带的。
      • @Stijn 将布尔参数linebrake 添加到接收单行base64 字符串的函数中会很有用。 if ((i mod 57)=0) and linebrake then Result:=Result+#13#10;
      猜你喜欢
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 2015-07-14
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 2019-06-27
      • 1970-01-01
      相关资源
      最近更新 更多