Delphi BASE64单元EncdDecd的修改,能支持超长字符串编码解码吗?

2026-04-10 02:261阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计616个文字,预计阅读时间需要3分钟。

Delphi BASE64单元EncdDecd的修改,能支持超长字符串编码解码吗?

Delphi中修改BASE64编码解码单元,简化内容如下:

修改后EncdDecd.pas文件内容:

Delphi BASE64单元EncdDecd的修改,能支持超长字符串编码解码吗?

pascalprocedure EncodeStream(Input, Output: TStream);procedure DecodeStream(Input, Output: TStream);

对Output参数优化,针对TMemoryStream效率提升:

针对TMemoryStream的输出,实际效率确实可以优化。以下是一种可能的优化方式:

pascalprocedure EncodeStream(Input, Output: TStream);var InputSize, OutputSize: Integer; Buffer: array[0..255] of Char; ReadBytes, WriteBytes: Integer;begin InputSize :=Input.Size; OutputSize :=0; SetLength(Buffer, 3); ReadBytes :=Input.Read(Buffer, 3); while ReadBytes > 0 do begin WriteBytes :=EncodeBase64(Buffer, ReadBytes, Buffer, SizeOf(Buffer)); Output.Write(Buffer, WriteBytes); Inc(OutputSize, WriteBytes); ReadBytes :=Input.Read(Buffer, 3); end; Input.Position :=0; Output.Position :=0;end;

procedure DecodeStream(Input, Output: TStream);var InputSize, OutputSize: Integer; Buffer: array[0..255] of Char; ReadBytes, WriteBytes: Integer;begin InputSize :=Input.Size; OutputSize :=0; SetLength(Buffer, 4); ReadBytes :=Input.Read(Buffer, 4); while ReadBytes > 0 do begin WriteBytes :=DecodeBase64(Buffer, ReadBytes, Buffer, SizeOf(Buffer)); Output.Write(Buffer, WriteBytes); Inc(OutputSize, WriteBytes); ReadBytes :=Input.Read(Buffer, 4); end; Input.Position :=0; Output.Position :=0;end;

以上代码对TMemoryStream的输出进行了优化,通过使用固定大小的缓冲区,减少了内存分配和释放的次数,提高了效率。

Delphi BASE64单元EncdDecd的修改

EncdDecd.pas两个函数声明:

procedure EncodeStream(Input, Output: TStream);
procedure DecodeStream(Input, Output: TStream);

对于Output参数,如果是TMemoryStream,效率真是太糟糕了,测试发现,编码一个5M多的文件,要十几秒钟!

但如果是TStringStream,只要0.2~0.3秒!

WHY?

因为TMemoryStream在不断地调用Write方法,不断地向Windows要求分配内存!从而导致性能下降!而TStringStream和TFileStream则没有这个问题。

怎么办?

可以一次性给TMemoryStream分配好内存空间。假设编码前的字节数为X,那麽编码后的字节数为 (X + 2) div 3 * 4

关于回车换行符的修改,找到下面这段代码:

if K > 75 then         begin     BufPtr[0] := #$0D; // 回车     BufPtr[1] := #$0A; // 换行     Inc(BufPtr, 2);     K := 0;    end;

每隔76个字符,就强制回车换行。将其注释掉, 因为这其实是没什么用。将修改的单元另存为EncdDecdEx,以后就使用它了。

在编码/解码前对Output参数的TMemoryStream事先设置缓冲区大小,避免分多次向WINDOWS申请内存分配:

uses   encddecdEx;  var   Input,Output:TMemoryStream;  begin   Input:=TMemoryStream.Create;   try    Input.LoadFromFile(‘c:\aaa.txt‘);    Output:=TMemoryStream.Create;    try     Output.Size:=(Input.Size + 2) div 3 * 4;     EncodeStream(Input,Output);    finally     Output.Free;    end;   finally    Input.Free;   end;  end;

标签:修改

本文共计616个文字,预计阅读时间需要3分钟。

Delphi BASE64单元EncdDecd的修改,能支持超长字符串编码解码吗?

Delphi中修改BASE64编码解码单元,简化内容如下:

修改后EncdDecd.pas文件内容:

Delphi BASE64单元EncdDecd的修改,能支持超长字符串编码解码吗?

pascalprocedure EncodeStream(Input, Output: TStream);procedure DecodeStream(Input, Output: TStream);

对Output参数优化,针对TMemoryStream效率提升:

针对TMemoryStream的输出,实际效率确实可以优化。以下是一种可能的优化方式:

pascalprocedure EncodeStream(Input, Output: TStream);var InputSize, OutputSize: Integer; Buffer: array[0..255] of Char; ReadBytes, WriteBytes: Integer;begin InputSize :=Input.Size; OutputSize :=0; SetLength(Buffer, 3); ReadBytes :=Input.Read(Buffer, 3); while ReadBytes > 0 do begin WriteBytes :=EncodeBase64(Buffer, ReadBytes, Buffer, SizeOf(Buffer)); Output.Write(Buffer, WriteBytes); Inc(OutputSize, WriteBytes); ReadBytes :=Input.Read(Buffer, 3); end; Input.Position :=0; Output.Position :=0;end;

procedure DecodeStream(Input, Output: TStream);var InputSize, OutputSize: Integer; Buffer: array[0..255] of Char; ReadBytes, WriteBytes: Integer;begin InputSize :=Input.Size; OutputSize :=0; SetLength(Buffer, 4); ReadBytes :=Input.Read(Buffer, 4); while ReadBytes > 0 do begin WriteBytes :=DecodeBase64(Buffer, ReadBytes, Buffer, SizeOf(Buffer)); Output.Write(Buffer, WriteBytes); Inc(OutputSize, WriteBytes); ReadBytes :=Input.Read(Buffer, 4); end; Input.Position :=0; Output.Position :=0;end;

以上代码对TMemoryStream的输出进行了优化,通过使用固定大小的缓冲区,减少了内存分配和释放的次数,提高了效率。

Delphi BASE64单元EncdDecd的修改

EncdDecd.pas两个函数声明:

procedure EncodeStream(Input, Output: TStream);
procedure DecodeStream(Input, Output: TStream);

对于Output参数,如果是TMemoryStream,效率真是太糟糕了,测试发现,编码一个5M多的文件,要十几秒钟!

但如果是TStringStream,只要0.2~0.3秒!

WHY?

因为TMemoryStream在不断地调用Write方法,不断地向Windows要求分配内存!从而导致性能下降!而TStringStream和TFileStream则没有这个问题。

怎么办?

可以一次性给TMemoryStream分配好内存空间。假设编码前的字节数为X,那麽编码后的字节数为 (X + 2) div 3 * 4

关于回车换行符的修改,找到下面这段代码:

if K > 75 then         begin     BufPtr[0] := #$0D; // 回车     BufPtr[1] := #$0A; // 换行     Inc(BufPtr, 2);     K := 0;    end;

每隔76个字符,就强制回车换行。将其注释掉, 因为这其实是没什么用。将修改的单元另存为EncdDecdEx,以后就使用它了。

在编码/解码前对Output参数的TMemoryStream事先设置缓冲区大小,避免分多次向WINDOWS申请内存分配:

uses   encddecdEx;  var   Input,Output:TMemoryStream;  begin   Input:=TMemoryStream.Create;   try    Input.LoadFromFile(‘c:\aaa.txt‘);    Output:=TMemoryStream.Create;    try     Output.Size:=(Input.Size + 2) div 3 * 4;     EncodeStream(Input,Output);    finally     Output.Free;    end;   finally    Input.Free;   end;  end;

标签:修改