Delphi 2010 - 解码来自XML doc的Base64编码图像

Jam*_*mes 3 delphi base64 xml-serialization delphi-2010

我试图从我的应用程序中的XML文档解码base64编码的EMF图像并在屏幕上呈现它,但是,它似乎永远不会出现.

如果我将XML文档中的数据复制/粘贴到Notepad ++中并使用该Base64 Decode选项并保存文件,因为.emf它在mspaint中打开正常.所以我认为问题是我如何解码它.

我尝试了以下这些文章中描述的解码方法:

如何编码/解码Base 64字符串
http://www.swissdelphicenter.ch/torry/showcode.php?id=1223

我也试过这TIdDecoderMIME堂课无济于事.

有谁知道从XML解码base64编码字符串的最可靠方法?

procedure TXmlSerializer.SaveImageFromString(const AValue: string);
var
  StrStream: TStringStream;
  Decoder: TIdDecoderMIME;
begin
  // AValue is base64 encoded string from XML doc
  Decoder := TIdDecoderMIME.Create(nil);
  try
    StrStream := TStringStream.Create(Decoder.DecodeString(AValue));
    try
      StrStream.SaveToFile('MyPath\Image.emf');
    finally
      StrStream.Free;
    end;
  finally
    Decoder.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

为什么以上不起作用,而是将原始数据复制到Notepad ++并解码和保存为.emf工作?

glo*_*lob 7

您正在使用字符串来存储二进制数据; Delphi 2010的unicode-ness可能会在这里"责怪".

尝试使用base64解码器,它支持解码到流,并直接解码到TFileStream; 我使用JclMime(Jedi的JCL的一部分),但是如果没有Indy MIME方法可以在流而不是字符串上工作,我会感到惊讶.

由于JclMime仅支持流到流解码,因此在从XML有效负载解码base64数据时使用以下包装器:

procedure MimeDecode(const inputString: string; const outputStream: Tstream);
var
  ss: TStringStream;
begin
  ss := TStringStream.Create(inputString);
  try
    JclMime.MimeDecodeStream(ss, outputStream);
  finally
    ss.free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)