Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Indy IdDeconderMIME.Decodestring konvertiert falsch (https://www.delphipraxis.net/133937-indy-iddecondermime-decodestring-konvertiert-falsch.html)

Markus70 12. Mai 2009 12:37


Indy IdDeconderMIME.Decodestring konvertiert falsch
 
Hallo,

ich habe ein Base-64 codiertes Feld, welches ein PDF-Dokument enthält.

Bisher habe ich es mit BDS2006 und dem IdDecoderMIME via DecodeString (Indy 10.1.5) problemlos umwandeln können.

Jetzt habe ich auf BDS2009 gewechselt und versuche das gleiche, muß jedoch feststellen, dass mit der aktuellen
IdDecoderMIME Komponente (Indy 10.2.5) einzelne Zeichen anders konvertiert werden, was logischerweise das Ergebnis
unbrauchbar macht.

Was läuft da schief?
Kann es sein, das die neuen Indy Komponenten nicht sauber laufen?
Kann ich in BDS2009 die alten Indy Komponenten einbinden oder was kann ich sonst machen??

Danke und Gruß
Markus

ulrich.b 12. Mai 2009 14:27

Re: Indy IdDeconderMIME.Decodestring konvertiert falsch
 
Zitat:

Zitat von Markus70
Kann ich in BDS2009 die alten Indy Komponenten einbinden oder was kann ich sonst machen??

Versuch mal die aktuelle version.

Hier:

svn://www.indyproject.org/indy/indy10/branches/Tiburon/Lib

oder hier indy10.zip (Delphi < 2009) oder IndyTiburon.zip (Delphi 2009):

http://indy.fulgan.com/ZIP/

Assertor 12. Mai 2009 14:37

Re: Indy IdDeconderMIME.Decodestring konvertiert falsch
 
Hallo Markus,

Zitat:

Zitat von Markus70
Was läuft da schief?
Kann es sein, das die neuen Indy Komponenten nicht sauber laufen?
Kann ich in BDS2009 die alten Indy Komponenten einbinden oder was kann ich sonst machen??

Die älteren Versionen der Indy Komponenten laufen nicht auf Delphi 2009 wegen der bekannten Umstellungen der Delphi RTL/VCL auf Unicode.

Kannst Du bitte mal ein Beispiel der Ein/Ausgabedaten und Deines Source hier posten?

Gruß Assertor

mjustin 12. Mai 2009 14:54

Re: Indy IdDeconderMIME.Decodestring konvertiert falsch
 
Zitat:

Zitat von ulrich.b

oder hier (indy10.zip):

http://indy.fulgan.com/ZIP/

Statt indy10.zip sollte man für Delphi 2009 besser http://indy.fulgan.com/ZIP/IndyTiburon.zip verwenden.

Das indy10.zip ist iirc noch die Version 10.2.3, ab Tiburon ist es 10.5.5

Cheers,

Markus70 12. Mai 2009 15:00

Re: Indy IdDeconderMIME.Decodestring konvertiert falsch
 
ok, danke.

Bekomme aber beim installieren der "dclIndyProtocols120" einen Fehler:

"Der Prozedureinsprungspunkt "@Idheadercoderindy@initialization$qqrv" wurde in der DLL "IndyProtocols120.bpl" nicht gefunden"

und dann

"Package "..\dclIndyProtocols120.bpl" kann nicht geladen werden. Die angegebene Prozedur existiert nicht".


Delphi 2009 entspricht doch Delphi 12, oder?

Markus70 13. Mai 2009 09:12

Re: Indy IdDeconderMIME.Decodestring konvertiert falsch
 
Habe die neue Indy Version installiert.
Leider bleibt der Fehler der gleiche!

Markus70 13. Mai 2009 09:43

Re: Indy IdDeconderMIME.Decodestring konvertiert falsch
 
Hier mal der reduzierte Source-code und im Archiv das XML File und die pdf Dateien, wie sie mit BDS2006 und D2009 rauskommen.

procedure TForm.ExtractPDF(Sender: TObject);
var
F,F2:TextFile;
field,value:string;
Line:Ansistring;
line2:widestring;
begin
AssignFile(F,'C:\MEDIUS\Clips\1.xml');
Reset(F);
while not EOF(F) do
begin
Readln(F,line);
field := copy(line,Pos('<',line)+1,Pos('>',line)-Pos('<',line)-1);
line := copy(line,Pos('>',line)+1,length(line)-Pos('>',line));
if Pos('</',line) > 0
then value := copy(line,1,Pos('</',line)-1)
else value := line;
if field = 'FileData' then line2 := IdDecoderMIME1.DecodeString(value);
end;
CloseFile(F);
AssignFile(F2,'C:\Medius\Clips\1.pdf');
ReWrite(F2);
Write(F2,line2);
CloseFile(F2);
end;

Assertor 13. Mai 2009 13:05

Re: Indy IdDeconderMIME.Decodestring konvertiert falsch
 
Hi Markus,

ich kann das Problem bei UTF8 Strings in D2009 zumindest teilweise nachvollziehen. Ich habe daher gerade bei uns im Team nachgefragt, ob da ein Problem bekannt ist. Sobald ich etwas genaueres weiß, poste ich wieder hier.

Gruß Assertor

Markus70 13. Mai 2009 13:10

Re: Indy IdDeconderMIME.Decodestring konvertiert falsch
 
Hallo Assertor,

super Danke.

Oder habe ich vielleicht eine andere Möglichkeit das pdf da raus zu bekommen?

Gruß
Markus

ulrich.b 13. Mai 2009 15:14

Re: Indy IdDeconderMIME.Decodestring konvertiert falsch
 
Bitte kein AssignFile/Reset/Readln/... verwenden (muffiger Pascal Style).

Sondern, ... TFileStream !!!

Oder fürs String parsen (iss bei dir nämlich auch grausig): TStringList und StringList.LoadFromFile('1.xml');

Delphi-Quellcode:
var
F,F2:TextFile;
field,value:string;
Line:Ansistring;
line2:widestring;
PdfBytes: TBytes;
//IdDecoderMIME1: TIdDecoderMIME;
OutStream: TFileStream;
begin
  //IdDecoderMIME1 := TIdDecoderMIME.Create(Self);

  AssignFile(F,'1.xml');
  Reset(F);
  while not EOF(F) do
  begin
    Readln(F,line);
    field := copy(line,Pos('<',line)+1,Pos('>',line)-Pos('<',line)-1);
    line := copy(line,Pos('>',line)+1,length(line)-Pos('>',line));
    if Pos('</',line) > 0 then
      value := copy(line,1,Pos('</',line)-1)
    else
      value := line;
    if field = 'FileData' then
    begin
      PdfBytes := IdDecoderMIME1.DecodeBytes(value);
    end;
  end;

  OutStream := TFileStream.Create('generated_1.pdf', fmCreate);
  try
    OutStream.WriteBuffer(PdfBytes[0], Length(PdfBytes));
  finally
    OutStream.Free;
  end;
end;
Funktioniert bei mir (zumindest mit der aktuellen Indy-Version)!

Assertor 13. Mai 2009 16:01

Re: Indy IdDeconderMIME.Decodestring konvertiert falsch
 
Hi,

@ulrich.b: In der tat, der Code wirkt damit schon fast antik ;)

Ich habe - zu meiner Schande - vor lauter Arbeit mir den Code nicht angesehen.

Das Problem, welches ich festgestellt habe, hat mit dem Code der hier gepostet wurde nichts zu tun. Es geht dabei ausschließlich um D2009 und UTF8Strings.

Jetzt muß ich sogar etwas zurückrudern: Es läuft prinzipiell auch mit den Delphi eigenen Base64 Routinen genau so. Die D2009 Routinen aus EncdDecd liefern das, was ich sehen wollte nur, wenn manuell ein Overload für UTF8Strings definiert wird und die StringStream Klasse auf dem TEncoding.UTF8String steht.

Ich hatte bei meinem Test das UTF8 Beispiel von http://de.wikipedia.org/wiki/Base64 verwendet. Dies liefert für Indy und für Delphis EncdDecd Unit das gleiche, abweichende Resultat. Da ich auf das selbe Resultat komme, wenn ich manuell einen UTF8String erzwinge, stimmt also alles.

Ich kam wegen meiner eigenen Base64 Unit hier in der Firma davon ab, weil ich UTF8Strings als Mime64 Eingabedaten gesondert behandele. Aber der Unittest stimmt und hat recht!

@Markus: Probiere bitte den Code von Ulrich.

Ich gehe jetzt nicht mehr von einem Bug aus.

Gruß Assertor

Markus70 13. Mai 2009 16:19

Re: Indy IdDeconderMIME.Decodestring konvertiert falsch
 
Hallo Ihr Beiden,

naja, ich gebe zu der Code ist an manchen Stellen sicherlich mal Überholungswürdig. :oops:
Ihr solltet erstmal den Rest sehen. :lol:
Aber ich selbst bin ja auch schon ein wenig in die Tage gekommen und was einmal läuft
ändert man eben nur ungern. Mal seh´n, wenn ich mal Zeit habe, dann überarbeite ich das irgendwann mal...

So, zum Problem:

Hat sich erledigt. Funktioniert jetzt einwandfrei. Tausend Dank! :thumb:

Viele Grüsse
Markus

Assertor 13. Mai 2009 16:35

Re: Indy IdDeconderMIME.Decodestring konvertiert falsch
 
Hi,

Zitat:

Zitat von Markus70
naja, ich gebe zu der Code ist an manchen Stellen sicherlich mal Überholungswürdig. :oops:
Ihr solltet erstmal den Rest sehen. :lol:

;)

Zitat:

Zitat von Markus70
Funktioniert jetzt einwandfrei. Tausend Dank! :thumb:

Das freut mich. Danke auch von mir an ulrich.b fürs Einspringen!

Gruß Assertor

:dp:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz