[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Hybrid View

  1. #1
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Da hilft nur, selber machen: https://www.scottklement.com/base64/
    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

  2. #2
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.005
    Hallo Claudia,

    wenn Dein String größer als 2732 Zeichen ist, dann versuche ihn doch mal zu splitten. Die ersten Blöcke müssen Vielfache von 3-Bytes Länge sein. Der letzte Block ist dann egal. Die Ergebnisse kannst Du dann wieder zusammenfügen. Dann sollte das richtige Ergebnis dabei rauskommen.

    Viele Grüße,
    KM

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Ja und nein.
    Das Problem ist, dass dann jeder Block auch weider einzeln dekodiert werden muss.
    Am Ende eines MIME64 wird mit 1 oder 2 "=" aufgefüllt damit die Anzahl Zeichen wieder durch 4 teilbar ist. Ich kann das schon verstehen, wenn die Daten als Block an eine andere Anwendung weiter gereicht werden muss, sollte die Kodierung auch vollständig in einem Block erfolgen.
    Also muss man es selber machen und halt Scott's Routinen ggf. auch aufbohren.

    Nachtrag:
    "Die ersten Blöcke müssen Vielfache von 3-Bytes Länge sein" habe ich übersehen, das passt dann ja.
    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

  4. #4
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.005
    hier ein Beispiel...

    Encode:
    values(systools.base64encode('DasisteinTes') concat systools.base64encode('tmitBase64Encode'))

    Decode:
    values((systools.base64decode('xIGiiaKjhYmV44Wi')) concat systools.base64decode('o5SJo8KBooX29MWVg5aEhQ=='))

    Beim Decode müssen es natürlich Blöcke mit einer Länge von Vielfachen von 4 Zeichen sein.

    Funktioniert also problemlos.

    Gruß,
    KM

  5. #5
    Registriert seit
    Apr 2016
    Beiträge
    8
    Hallo KM,

    vielen Dank für die hilfreiche Antwort. Das lässt sich mit SQLRPGLE en- und decoden. Jedoch wenn ich die Webseite https://www.base64decode.org/ benutze, klappt das nicht. Haben Sie noch einen Hinweis dazu?

    Viele Grüße
    Claudia

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Das ist tatsächlich ein Problem.
    Hier spielt die Bitwertigkeit der unterschiedlichen Codepages natürlich eine gewaltige Rolle.
    Mime64 macht aus 3x8-Bit 4x6-Bit. Diese 6 Bits werden über eine Tabelle als Index in die 32 möglichen Zeichen übersetzt. Nun ist aber bei der Aufteilung von EBCDIC '000' = x'F0F0F0' ='111100001111000011110000' eine andere Bitfolge entstanden als bei ASCII '000' = x'303030' = '001100000011000000110000'. Dies führt wegen des anderen Index zu einer anderen Kodierung in Mime und kann daher nicht korrekt auf einem anderen System dekodiert werden.
    Wenn du also das MIME-Format mit der ASCII-Welt austauschen willst, musst du deine Quelldaten vorher in ASCII übersetzten. Dies kannst du am Besten mit der CCSID 1208 (UTF-8) erreichen. Dann bist du auch sprachneutral. Beim Dekodieren musst du dann halt von 1208 wieder in 273 o.ä. 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

  7. #7
    Registriert seit
    Aug 2014
    Beiträge
    179
    Hallo Forum,

    für das Encode und Decode von BASE64 gibt es API's auf dem System.
    Die sollten bis zu einer Größe von 2GB problemlos funktionieren.
    Wenn bei der Konvertierung mit der Seite https://www.base64decode.org/
    andere Ergebnisse kommen, dann liegt das daran, dass die Seite UTF8 benutzt.

    Damit mit den API's die gleichen Ergebnisse kommen, muss beim Encoding erst
    nach UTF8 konvertiert und dann nach BASE64 codiert werden.

    PHP-Code:
    //------------------------------------------------------------------//
    // BASE64 - Encode String - SRVPGM(QSYSDIR/QAXIS10HT)               //
    //------------------------------------------------------------------//
                                                                          
       
    dcl-pr encbase64bin int(10extproc('apr_base64_encode_binary');   
               
    encoded_p   pointer value;                                 
               
    source_p    pointer value;                                 
               
    sourcelen   int(10value;                                 
       
    end-pr;
                                                                
    //------------------------------------------------------------------//
    // BASE64 - Decode String - SRVPGM(QSYSDIR/QAXIS10HT)               //
    //------------------------------------------------------------------//
                                                                          
       
    dcl-pr decbase64bin int(10extproc('apr_base64_decode_binary');   
               
    decoded_p   pointer value;                                 
               
    encoded_p   pointer value;                                 
       
    end-pr
    Herzliche Grüße

    Rainer

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    UTF8 oder nur ANSI/ASCII ist letztlich egal, halt nur kein EBCDIC.
    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. #9
    Registriert seit
    Apr 2016
    Beiträge
    8
    Hallo Fuerchau,
    hallo zusammen,

    wie kann ich zu utf-8 konvertieren? Reicht es wenn die Quelle in einem Datenbankfeld mit der CCSID 1208 gespeichert ist?
    Vielen Dank für die Hilfe!
    Viele Grüße
    Claudia

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    CCSID 1208 ist UTF-8.
    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

  11. #11
    Registriert seit
    Aug 2014
    Beiträge
    179
    Am besten ich poste ein Beispiel

  12. #12
    Registriert seit
    Aug 2014
    Beiträge
    179
    Hier ist das Beispiel:
    der Text: "Test mit Umlauten äöü" ergibt folgenden BASE64 Code: VGVzdCBtaXQgVW1sYXV0ZW4gw6TDtsO8

    CL zum Erstellen des BASE64 Utilities
    PHP-Code:
    /*********************************************************************/
    /*                                                                   */
    /* CREATE BASUTL SERVICE-PROGRAM - BASE64                            */
    /*                                                                   */
    /******************                                                  */
    /* R.ROSS 03.2017 *                                                  */
    /*********************************************************************/

       
    PGM

       DCL        
    VAR(&LIBTYPE(*CHARLEN(10VALUE(MYLIB)

       
    MONMSG     MSGID(CPF0000)

    /*********************************************************************/
    /* VERARBEITUNG                                                      */
    /*********************************************************************/

       
    DLTBNDDIR  BNDDIR(&LIB/BASUTL)
       
    CRTBNDDIR  BNDDIR(&LIB/BASUTLTEXT('BASE64 Utilities')

       
    ADDBNDDIRE BNDDIR(&LIB/BASUTLOBJ((QSYSDIR/QAXIS10HT *SRVPGM))

    /*********************************************************************/
    /* ENDE                                                              */
    /*********************************************************************/
       
    ENDE:      ENDPGM
    /*********************************************************************/ 
    /include BASE64
    PHP-Code:
          //------------------------------------------------------------------//    
          // BASE64 - Encode String - SRVPGM(QSYSDIR/QAXIS10HT)               //    
          //------------------------------------------------------------------//    
                                                                                    
             
    dcl-pr encbase64bin int(10extproc('apr_base64_encode_binary');       
                     
    ##enc_p     like(d#enc_p)  value;    // Encoded                
                     ##src_p     like(d#src_p)  value;    // Source                 
                     ##srclen    like(d#srclen) value;    // SourceLength           
             
    end-pr;                                                                
                                                                                    
          
    //------------------------------------------------------------------//    
          // BASE64 - Decode String - SRVPGM(QSYSDIR/QAXIS10HT)               //    
          //------------------------------------------------------------------//    
                                                                                    
             
    dcl-pr decbase64bin int(10extproc('apr_base64_decode_binary');       
                     
    ##dec_p     like(d#dec_p)  value;    // Decoded                
                     ##enc_p     like(d#enc_p)  value;    // Encoded                
             
    end-pr;                                                                
                                                                                    
          
    //------------------------------------------------------------------//    
          // BASE64 - Variables                                               //    
          //------------------------------------------------------------------//    
                                                                                    
             
    dcl-s   d#enc_p     pointer;                 // EncodedPointer         
             
    dcl-s   d#dec_p     pointer;                 // DecodedPointer         
             
    dcl-s   d#src_p     pointer;                 // SourcePointer          
             
    dcl-s   d#srclen    int(10);                 // SourceLength           
                                                                                    
          //------------------------------------------------------------------// 
    /include iconv
    PHP-Code:
          //------------------------------------------------------------------//    
          // iconv_open                                                       //    
          //------------------------------------------------------------------//    
                                                                                    
             
    dcl-pr iconv_open   likeds(dsiconvextproc('QtqIconvOpen');           
                     
    ##trgcode   likeds(dstqopen) const;                            
                     ##srccode   likeds(dstqopen) const;                            
             
    end-pr;                                                                
                                                                                    
          
    //------------------------------------------------------------------//    
          // iconv                                                            //    
          //------------------------------------------------------------------//    
                                                                                    
             
    dcl-pr iconv        extproc(*dclcase);                                 
                     
    ic_hconv    like(dsiconvvalue;                               
                     
    p_inbuf     pointer const;                                     
                     
    in_length   uns(10) const;                                     
                     
    p_outbuf    pointer const;                                     
                     
    out_length  uns(10) const;                                     
             
    end-pr;                                                                
                                                                                    
          
    //------------------------------------------------------------------//    
          // iconv_close                                                      //    
          //------------------------------------------------------------------//    
                                                                                    
             
    dcl-pr iconv_close  extproc(*dclcase);                                 
                     
    ic_hconv    like(dsiconvvalue;                               
             
    end-pr;                                                                
                                                                                    
          
    //------------------------------------------------------------------//    
          // Arrays iconv                                                     //    
          //------------------------------------------------------------------//    
                                                                                    
             
    dcl-ds  dsiconv     template qualified inz;                            
                      
    ic_rtnval  int(10);                                           
                      
    ic_cd      int(10dim(12);                                   
             
    end-ds;                                                                
                                                                                    
             
    dcl-ds  dstqopen    template qualified;                                
                      
    tq_ccsid   int(10inz(0);                                    
                      
    tq_convalt int(10inz(0);                                    
                      
    tq_subsalt int(10inz(0);                                    
                      
    tq_shftalt int(10inz(1);                                    
                      
    tq_inplen  int(10inz(0);                                    
                      
    tq_erropt  int(10inz(0);                                    
                      
    tq_reserv  char(8inz(*allx'00');                            
             
    end-ds;                                                                
                                                                                    
             
    dcl-ds  dsconv      likeds(dsiconv)  inz(*likeds);                     
             
    dcl-ds  dssrcccsid  likeds(dstqopeninz(*likeds);                     
             
    dcl-ds  dstrgccsid  likeds(dstqopeninz(*likeds);                     
                                                                                    
          
    //------------------------------------------------------------------// 
    RPGLE für das Encoding

    PHP-Code:
             ctl-opt main(maindftactgrp(*nobnddir('BASUTL');
          
    //------------------------------------------------------------------//
          //                                                                  //
          // Encode BASE64                                                    //
          //                                                                  //
          //-----------------                                                 //
          // R.Ross 03.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);

               
    LocString 'Test mit Umlauten äöü';

               
    LocBase64 getBase64(LocString);

             
    end-proc;
          
    //------------------------------------------------------------------//
          // getBASE64 Encoded String                                         //
          //------------------------------------------------------------------//
             
    dcl-proc getBase64;
             
    dcl-pi *n           like(GblStringrtnparm// Encoded String
                     
    PiString    like(GblString);
             
    end-pi;

             
    dcl-s   LocString   like(GblStringinz;     // Source String
             
    dcl-s   LocBase64   like(GblStringinz;     // Encoded String
             
    dcl-s   Loclength   int(10);                 // StringLength
             
    dcl-s   LocEnclen   int(10);                 // EncodedLength

               
    LocLength = %len(%trimr(PiString));        // String-Length
               
    LocString cvtData(%addr(PiString):LocLength:1208:1141);
               
    LocLength = %len(%trimr(LocString));       // String-Length

               
    LocEnclen encbase64bin(%addr(LocBase64): // Encode Base64
                                        
    %addr(LocString):LocLength);

               if 
    LocEnclen > *zero;                      // Encoded Length
                  
    return %subst(LocBase64:1:LocEnclen 1);// without last null
                
    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

Similar Threads

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

Berechtigungen

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