Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Delphi将大文件转换为base64_Delphi_Base64_String Conversion - Fatal编程技术网

使用Delphi将大文件转换为base64

使用Delphi将大文件转换为base64,delphi,base64,string-conversion,Delphi,Base64,String Conversion,我需要将文件从480mb转换为base64,但我不能。我总是记不住这封信。有人有什么建议吗 function TFormService.LoadFileToBase64(const AFileName: string): String; var // stream: TMemoryStream; Encoder: TIdEncoderMIME; Base64String: String; LStream: TMemoryStream; begin Encoder := TIdE

我需要将文件从480mb转换为base64,但我不能。我总是记不住这封信。有人有什么建议吗

function TFormService.LoadFileToBase64(const AFileName: string): String;
var
//  stream: TMemoryStream;
  Encoder: TIdEncoderMIME;
  Base64String: String;
  LStream: TMemoryStream;
begin
  Encoder := TIdEncoderMIME.Create;
  LStream := TMemoryStream.Create;
  try
    LStream.LoadFromFile(AFileName);
    Base64String := Encoder.Encode(LStream);
  finally
    FreeAndNil(Encoder);
    FreeAndNil(LStream);
  end; // try finally


//  stream := TMemoryStream.Create;
//  try
//    stream.LoadFromFile(AFilename);
//    result := EncodeBase64(stream.Memory, stream.Size);
//  finally
//    stream.Free;
//  end;
end;

您不应该在内存中保存整个Base64字符串。480MB编码到Base64将产生约640M个字符,占用约1.28GB内存。这在32位应用程序中肯定会失败

最好将编码的字符串写入文件,并为此使用适当的编码器。最近的Delphi版本具有System.NetEncoding:

procedure ConvertFileToBase64(const AInFileName, AOutFileName: string);
var
  inStream: TStream;
  outStream: TStream;
begin
  inStream := TFileStream.Create(AInFileName, fmOpenRead);
  try
    outStream := TFileStream.Create(AOutFileName, fmCreate);
    try
      TNetEncoding.Base64.Encode(inStream, outStream);
    finally
      outStream.Free;
    end;
  finally
    inStream.Free;
  end;
end;

使用TFilestream而不是TMemorystream…ty,但未解决。[link][/link]尝试1流。位置:=0;LoadFromFile.com之后出现同样的问题。从…里面memory@William在D2007及更早版本中,生成的base64字符串为573MB,在D2009及更高版本中为1GB。字符串的最大长度限制为MaxInt(~20亿)个字符或可用内存,以较小者为准。但也要记住,数据首先被编码到一个中间字节数组中,因此在准备最后的字符串时还有573MB在使用。输出文本是否使用ASCII字符,而不是UTF-16编码?@ArnaudBouchez,纯ASCII。编码只对字节有效,因此这里不涉及字符串。