我使用了Binary到你回答的Base64功能: Binary to Base64 (Delphi)
我成功将文件编码为base64字符串并将其写入MsSQL2008数据库,但我想问一个问题: 如何使用EncdDecd.pas?
再次将此文件写入磁盘答案 0 :(得分:15)
大卫一如既往地回答。虽然我无法抗拒使用最近的Delphi版本中的一些好东西给出一个稍微不同的解决方案。
procedure DecodeFile(const base64: AnsiString; const FileName: string);
var
stream: TBytesStream;
begin
stream := TBytesStream.Create(DecodeBase64(base64));
try
stream.SaveToFile(Filename);
finally
stream.Free;
end;
end;
答案 1 :(得分:6)
此函数将采用base64编码的字符串,对其进行解码,并将生成的字节数组写入文件。
procedure DecodeToFile(const base64: AnsiString; const FileName: string);
var
stream: TFileStream;
bytes: TBytes;
begin
bytes := DecodeBase64(base64);
stream := TFileStream.Create(FileName, fmCreate);
try
if bytes<>nil then
stream.Write(bytes[0], Length(Bytes));
finally
stream.Free;
end;
end;
要解释这里发生的事情,第一行
bytes := DecodeBase64(base64);
执行解码并在TBytes
变量中返回文件的已解码二进制内容。 TBytes
只是一个字节数组。
下一步是创建文件。在Delphi中编写文件的惯用方法是使用流。在这种情况下,我们需要TFileStream
。
stream := TFileStream.Create(FileName, fmCreate);
fmCreate
选项意味着如果文件已经存在,它将被我们编写的内容替换和覆盖。
最后一步是将字节数组的内容写入文件
if bytes<>nil then
stream.Write(bytes[0], Length(Bytes));
if bytes<>nil
检查是为了处理base64字符串解码为空数组的情况。如果我们要删除该检查,那么如果您在启用范围检查(您应该这样做)的情况下运行,则以下行将导致运行时错误。对stream.Write
的调用应该是不言自明的。
答案 2 :(得分:1)
uses
Soap.EncdDecd;
function TForm1.EncodeFile(const FileName: string): AnsiString;
var
MemStream: TMemoryStream;
begin
MemStream := TMemoryStream.Create;
try
MemStream.LoadFromFile(Filename);
Result := EncodeBase64(MemStream.Memory, MemStream.Size);
finally
MemStream.Free;
end;
end;
function TForm1.DecodeFile(const base64: AnsiString): TBytesStream;
begin
Result := TBytesStream.Create(DecodeBase64(base64));
end;
答案 3 :(得分:0)
我有一个非常旧的Delphi2006(v10.0.2558.35231更新2),并且必须解码base64 UTF8编码的输入字符串。我终于弄清楚了,并且对任何有兴趣的人都是一个例子。
Uses
IdCoderMIME; // Indy9
var
decoder: TIdDecoderMIME;
str: WideString;
- - -
decoder := TIdDecoderMIME.Create(nil);
str := base64DecodeUTF8(decoder, b64sourcestr);
decoder.Free;
- - -
function base64DecodeUTF8(decoder:TIdDecoderMIME; str:String): WideString;
var
stream:TMemoryStream;
utf8: UTF8String;
//idx:Integer;
begin
stream := TMemoryStream.Create;
try
decoder.DecodeToStream(str, stream);
setString(utf8, PChar(stream.Memory), stream.Size);
Result := UTF8Decode(utf8);
//for idx := 0 to stream.Size-1 do begin
// Writeln(PChar(stream.Memory)[idx] + ' ' + IntToStr(ORD(PChar(stream.Memory) [idx])) );
//end;
finally
stream.Free;
end;
end;
答案 4 :(得分:0)
在研究Soap.EncdDecd之后,可以找到更多与平台无关的方式,因为它的DecodeBase64使用System.NetEncoding中的通用(无AnsiString)方法。
基于Uwe的样本:
uses
...
System.Classes,
System.NetEncoding;
...
procedure DecodeFile(const base64: String; const FileName: string);
var
stream: TBytesStream;
begin
stream := TBytesStream.Create(TNetEncoding.Base64.DecodeStringToBytes(base64));
try
stream.SaveToFile(Filename);
finally
stream.Free;
end;
end;