![]() |
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 |
Re: Indy IdDeconderMIME.Decodestring konvertiert falsch
Zitat:
Hier: svn://www.indyproject.org/indy/indy10/branches/Tiburon/Lib oder hier indy10.zip (Delphi < 2009) oder IndyTiburon.zip (Delphi 2009): ![]() |
Re: Indy IdDeconderMIME.Decodestring konvertiert falsch
Hallo Markus,
Zitat:
Kannst Du bitte mal ein Beispiel der Ein/Ausgabedaten und Deines Source hier posten? Gruß Assertor |
Re: Indy IdDeconderMIME.Decodestring konvertiert falsch
Zitat:
![]() Das indy10.zip ist iirc noch die Version 10.2.3, ab Tiburon ist es 10.5.5 Cheers, |
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? |
Re: Indy IdDeconderMIME.Decodestring konvertiert falsch
Habe die neue Indy Version installiert.
Leider bleibt der Fehler der gleiche! |
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; |
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 |
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 |
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:
Funktioniert bei mir (zumindest mit der aktuellen Indy-Version)!
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; |
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 ![]() 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 |
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 |
Re: Indy IdDeconderMIME.Decodestring konvertiert falsch
Hi,
Zitat:
Zitat:
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