[NEWSboard IBMi Forum]
Seite 3 von 3 Erste ... 2 3
  1. #25
    Registriert seit
    Apr 2016
    Beiträge
    8
    Lieber Rainer,

    leider habe ich beim Dekodieren noch einen Fehler. Ich versuche einen String (CLOB CCSID 1208) base64 zu dekodieren und das Ergebnis soll als .PDF gespeichert werden. Beim Dekodieren werden jedoch nur Hieroglyphen angezeigt. Ich habe, wie Du oben vorgeschlagen hast, zuerst das decBase64bin und anschließend das cvtData von 1208 auf 1141 aufgerufen, leider alles vergeblich. Könntest Du bitte noch ein Beispiel für das Decode posten?

    Vielen Dank!

    Viele Grüße
    Claudia

  2. #26
    Registriert seit
    Feb 2001
    Beiträge
    20.206
    Da hast du so leider keine Chance.
    Wenn der String, den du in 1208 bekommst, bereits base64 codiert ist, dann muss die base64-dekodierung in ASCII erfolgen.
    Eine Codewandlung vorher/nachher bringt hier nichts, da die Bitwertigkeit nicht stimmt.

    Du benötigst also eine ASCII-Decodierung, anschliessend kannst du das Ergebnis dann nach 1141 umwandeln.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #27
    Registriert seit
    Apr 2016
    Beiträge
    8
    Hallo,
    eine Dekodierung in ASCII ?
    Muss ich dafür eine eigene Prozedur in der API aufrufen, wie etwa ' decbase64bin int(10) extproc('apr_base64_decode_binary')'....?

    Oder
    muss ich den Eingangsparameter in ASCII umsetzen und mit diesem die angegebene API aufrufen?

    Wenn ich das cvtdata von 1208 nach 850 aufrufe, funktioniert das nicht ;-(

    Hast du vllt. ein Dekodierbeispiel für mich ?

    Vielen Dank vorab

    Viele Grüße
    Claudia

  4. #28
    Registriert seit
    Feb 2001
    Beiträge
    20.206
    Da musst du dir die Routine von Scott Clement runterladen:
    https://www.scottklement.com/base64/

    Hier wird eine native codierung/decodierung in EBCDIC durchgeführt.
    Diese musst du nun als ASCII-Version erstellen.
    Hierzu müssen die Tabellen in ASCII umgewandelt werden bevor die Dekodierung durchgeführt wird und nach der Dekodierung kann die ASCII->EBCDIC-Umwandlung erfolgen.

    Alternativ lass dir ein Java-Programm schreiben, dass läuft immer in ASCII/ANSI.
    Oder ggf. gibt es irgendwo C-Tools, die sich nach Pase konvertieren lassen.
    Oder lass dir ein PC-Programm (.NET) schreiben, dass die Daten per SQL/ODBC liest in Text dekodiert und wieder in die DB schreibt.
    Oder, oder, ...
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #29
    Registriert seit
    Aug 2014
    Beiträge
    179
    Liebe Claudia,

    anbei das Beispiel mit BASE64 Decoding. Für die Decodierung des CLOB CCSID 1208
    Strings gibt es auch eine pfiffige Lösung. Wenn Du dafür ein Beispiel benötigst, dann
    gib mir einfach bescheid.
    PHP-Code:
             ctl-opt main(maindftactgrp(*nobnddir('BASUTL');
          
    //------------------------------------------------------------------//
          //                                                                  //
          // Decode BASE64                                                    //
          //                                                                  //
          //-----------------                                                 //
          // R.Ross 04.2017 *                                                 //
          //------------------------------------------------------------------//
          // Prototypen                                                       //
          //------------------------------------------------------------------//

          
    /include webutl/qcpysrc,iconv                   // iconv
          
    /include webutl/qcpysrc,base64                  // BASE64

          //------------------------------------------------------------------//
          // Variablen                                                        //
          //------------------------------------------------------------------//

             
    dcl-s   GblString   char(1000000);           // Text 1 MB

          //------------------------------------------------------------------//
          // Main                                                             //
          //------------------------------------------------------------------//
             
    dcl-proc Main;

             
    dcl-s   LocString   like(GblString);
             
    dcl-s   LocBase64   like(GblString);

          
    // Test mit Umlauten äöü
          // VGVzdCBtaXQgVW1sYXV0ZW4gw6TDtsO8

               
    LocBase64 'VGVzdCBtaXQgVW1sYXV0ZW4gw6TDtsO8';

               
    LocString decBase64(LocBase64:1141:1208);

             
    end-proc;
          
    //------------------------------------------------------------------//
          // Decode Base64                                                    //
          //------------------------------------------------------------------//
             
    dcl-proc decBase64;
             
    dcl-pi *n           like(GblStringrtnparm// Decoded String
                     
    PiBase64    like(GblString);         // Encoded String
                     
    PiTrgCcsid  uns(10) const;           // Target-CCSID
                     
    PiSrcCcsid  uns(10) const;           // Source-CCSID
             
    end-pi;

             
    dcl-s   LocString   like(GblStringinz;     // Result String
             
    dcl-s   LocDecStr   like(GblStringinz;     // Decoded String
             
    dcl-s   LocLength   int(10);                 // StringLength
             
    dcl-s   LocDeclen   int(10);                 // DecodedLength

               
    LocDeclen decBase64Bin(%addr(LocDecStr):%addr(PiBase64));

               
    LocLength = %len(%trimr(LocDecStr));       // String-Length
               
    LocString cvtData(%addr(LocDecStr):LocLength:
                                   
    PiTrgCcsid:PiSrcCcsid);
               
    LocLength = %len(%trimr(LocString));       // String-Length

               
    if LocDeclen > *zero;                      // Decoded Length
                  
    return %subst(LocString:1:LocDecLen);   // Decoded String
                
    else;
                  return *
    blanks;
               endif;

             
    end-proc;
          
    //------------------------------------------------------------------//
          // Convert Data between CCSID's                                     //
          //------------------------------------------------------------------//
             
    dcl-proc cvtData;
             
    dcl-pi *n           like(GblStringrtnparm// Result
                     
    PiSrc_p     pointer const;           // Source-Pointer
                     
    PiSrcLen    uns(10) const;           // Source-Length
                     
    PiTrgCcsid  uns(10) const;           // Target-CCSID
                     
    PiSrcCcsid  uns(10) const;           // Source-CCSID
             
    end-pi;

             
    dcl-s   LocTarget   like(GblStringinz;     // Target
             
    dcl-s   LocTrg_p    pointer inz(%addr(LocTarget));
             
    dcl-s   LocTrglen   uns(10inz(%size(LocTarget));

               
    DsSrcCcsid.tq_ccsid PiSrcCcsid;          // Source-CCSID
               
    DsTrgCcsid.tq_ccsid PiTrgCcsid;          // Target-CCSID
               
    DsConv              = *allx'00';

               
    DsConv iconv_open(DsTrgCcsid:DsSrcCcsid);        // Open
               
    iconv(DsConv:PiSrc_p:PiSrcLen:LocTrg_p:LocTrglen); // Convert
               
    iconv_close(DsConv);                               // Close

               
    return %subst(LocTarget:1:%size(LocTarget) - LocTrglen);

             
    end-proc;
          
    //------------------------------------------------------------------// 
    Herzliche Grüße
    Rainer

  6. #30
    Registriert seit
    Feb 2001
    Beiträge
    20.206
    Auf dieser Seite:
    https://www.base64encode.org/
    Kommt die Kodierung und Dekodierung zum selben Ergebnis.
    Also muss das Problem noch woanders liegen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #31
    Registriert seit
    Apr 2008
    Beiträge
    83
    Hallo,

    ich sitze an einem ähnlichen Problem. PDF-Datei aus Webservice mit Base64 kodiert. Egal ob ich die Routine von Scott nehme oder die IBM-API, ich bekomme nur einige Zeichen umgesetzt. Es ist als würde es dann abbrechen.

    Wenn ich das über www.base64decode.org umwandle klappt das. Ich bekomme direkt das PDF-Dokument zum Download. Schaltet man aber den Live-Mode an, wird angezeigt "Malformed input... ".

    Besser geht es über www.base64decode.com. Dort wird das umgewandelt und sieht so aus, als wenn ich die PDF-Datei mit Notepad öffne.

    Beispiel:
    Der Code beginnt mit:
    Code:
    JVBERi0xLjQKJeLjz9MKMyAwIG9iago8PC9UeXBlL1hPYmplY3QvQ29sb3JTcGFjZVsvSW5kZXhlZC9EZXZpY2VSR0IgMjU1KPPz80hISNra2mFhYcLCwra2tqmpqefn55KSknl5eYWFhVRUVG1tbc7Ozp2dnTw8PP
    Lt. www.base64decode.com entspricht das:
    Code:
    %PDF-1.4
    %âãÏÓ
    3 0 obj
    <</Type/XObject/ColorSpace[/Indexed/DeviceRGB 255(óóóHHHÚÚÚaaa¶¶¶©©©ççç’’’yyy………TTTmmmÎÎ͝<<<ð
    Über das RPG-Programm bekomme ich nicht mehr als
    Code:
    %PDF-1.4
    %
    Hat jemand eine Idee, wie ich das lösen kann oder benötige ich die "pfiffige Lösung" von Rainer?

    Danke schon mal.

  8. #32
    Registriert seit
    Feb 2001
    Beiträge
    20.206
    Du musst immer daran denken, dass Base64 ASCII-basiert ist.
    Wenn du die Daten also per IFS-API's einliest, musst du auf jeden Fall die Daten binär einlesen, damit keine EBCDIC-Umsetzung erfolgt, denn dies zerstört die Bit-Folge.
    Anschließend dekodieren und je nach Ergebnis, ob die Usrsprungskodierung UTF8 war, von UTF8 nach UCS2 oder einfach nach EBCDIC wandeln.

    Für solche Sachen sind aber eher Java-Funktionen, da diese bereits eine Base64-Klasse implementieren.
    Baue, oder lasse dir bauen, ein kleines Java-Progrämmchen (wenige Zeilen), dass eine IFS-Datei von Base64 nach UTF8 dekodiert. Das kann man per Eclipse testen und anschielßend auf der AS/400 auch ausführen (RUNJVA).
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  9. #33
    Registriert seit
    Apr 2008
    Beiträge
    83
    Ich benutze für den Webservice die HTTP-API von Scott Klement. Ich nutze http_post und http_parse_xml_stmf, da der Base64-String, der die PDF darstellt, in einer XML-Antwort enthalten ist. Ich habe beim http_parse_xml_stmf von HTTP_STMF_CALC auf HTTP_XML_CALC umgestellt. Damit wird die Datei nicht mehr mit O_TEXTDATA geöffnet und entsprechend binär verarbeitet. Dann funktioniert auch das Dekodieren.

    Danke.

Similar Threads

  1. Problem mit Java-Methoden Aufruf aus ILE RPG?
    By Stoeberl in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 10-01-07, 11:58
  2. Nochmal CCSID FTP ASCII -> I5
    By oopsy-dear in forum IBM i Hauptforum
    Antworten: 13
    Letzter Beitrag: 11-11-05, 13:55
  3. CCSID Problem aufs Neue
    By b.horstmann in forum NEWSboard Programmierung
    Antworten: 15
    Letzter Beitrag: 12-10-05, 12:26
  4. Problem mit CCSID
    By Ralle in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 25-07-05, 15:58
  5. CCSID Problem
    By Arbi in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 13-10-01, 12:59

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •