-
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(10) extproc('apr_base64_encode_binary'); encoded_p pointer value; source_p pointer value; sourcelen int(10) value; end-pr; //------------------------------------------------------------------// // BASE64 - Decode String - SRVPGM(QSYSDIR/QAXIS10HT) // //------------------------------------------------------------------// dcl-pr decbase64bin int(10) extproc('apr_base64_decode_binary'); decoded_p pointer value; encoded_p pointer value; end-pr;
Herzliche Grüße
Rainer
-
UTF8 oder nur ANSI/ASCII ist letztlich egal, halt nur kein EBCDIC.
-
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
-
-
Am besten ich poste ein Beispiel
-
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(&LIB) TYPE(*CHAR) LEN(10) VALUE(MYLIB)
MONMSG MSGID(CPF0000)
/*********************************************************************/ /* VERARBEITUNG */ /*********************************************************************/
DLTBNDDIR BNDDIR(&LIB/BASUTL) CRTBNDDIR BNDDIR(&LIB/BASUTL) TEXT('BASE64 Utilities')
ADDBNDDIRE BNDDIR(&LIB/BASUTL) OBJ((QSYSDIR/QAXIS10HT *SRVPGM))
/*********************************************************************/ /* ENDE */ /*********************************************************************/ ENDE: ENDPGM /*********************************************************************/
/include BASE64
PHP-Code:
//------------------------------------------------------------------// // BASE64 - Encode String - SRVPGM(QSYSDIR/QAXIS10HT) // //------------------------------------------------------------------// dcl-pr encbase64bin int(10) extproc('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(10) extproc('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(dsiconv) extproc('QtqIconvOpen'); ##trgcode likeds(dstqopen) const; ##srccode likeds(dstqopen) const; end-pr; //------------------------------------------------------------------// // iconv // //------------------------------------------------------------------// dcl-pr iconv extproc(*dclcase); ic_hconv like(dsiconv) value; 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(dsiconv) value; end-pr; //------------------------------------------------------------------// // Arrays iconv // //------------------------------------------------------------------// dcl-ds dsiconv template qualified inz; ic_rtnval int(10); ic_cd int(10) dim(12); end-ds; dcl-ds dstqopen template qualified; tq_ccsid int(10) inz(0); tq_convalt int(10) inz(0); tq_subsalt int(10) inz(0); tq_shftalt int(10) inz(1); tq_inplen int(10) inz(0); tq_erropt int(10) inz(0); tq_reserv char(8) inz(*allx'00'); end-ds; dcl-ds dsconv likeds(dsiconv) inz(*likeds); dcl-ds dssrcccsid likeds(dstqopen) inz(*likeds); dcl-ds dstrgccsid likeds(dstqopen) inz(*likeds); //------------------------------------------------------------------//
RPGLE für das Encoding
PHP-Code:
ctl-opt main(main) dftactgrp(*no) bnddir('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(GblString) rtnparm; // Encoded String PiString like(GblString); end-pi;
dcl-s LocString like(GblString) inz; // Source String dcl-s LocBase64 like(GblString) inz; // 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(GblString) rtnparm; // 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(GblString) inz; // Target dcl-s LocTrg_p pointer inz(%addr(LocTarget)); dcl-s LocTrglen uns(10) inz(%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
-
Hallo lieber Rainer,
vielen Dank, das Beispiel hat einwandfrei funktioniert. Muss ich beim Decoden was ändern, bspw. die CCSID?
viele Grüße
Claudia
-
Liebe Claudia,
beim Decode zuerst decBase64Bin aufrufen und dann cvtData von 1208 nach 1141
<code><code>cvtData(%addr(PiString):LocLength:1141:1208); // 1208 -> 1141
</code></code>
Herzliche Grüße
Rainer
-
Ich häng mich mal in dieses Thema an, da die Problematik vermutlich in die gleiche Richtung geht.
Ausgangslage:
Ich muss einen XML String mit XML-Sax verarbeiten. Im IFS steht das File mit CCSID 1252 (Windows). Natürlich knallts bei den Umlauten, klein geschrieben nicht so heftig, aber bei Ä,Ö,Ü erhalt ich eine Exception. Na gut, dann kopier ich das IFS-File auf CCSID 1208 um, aber denkste. Nix hat sich geändert.
Frage nun, komm ich da mit einer iconv Konvertierung weiter?
p.s. ist nicht so, dass ich im Forum nicht gesucht hätte.
kf
-
Wo "knallt" es denn?
Umlaute in den Daten sind unkritisch und lösen keine Fehler aus, Umlaute in den Knoten- und Attributnamen könnten da eher die Ursache sein, da diese sich den RPG-Namen nicht zuordnen lassen.
Hier ist in den XML-Optionen "converts" oder so anzugeben. Dann werden die Zeichen in ungültigen XML-Namen in "_" umgesetzt, die RPG-Namen sind dann analog zu bilden.
-
Hallo Baldur,
Es ist der Feldinhalt, Nodes und Elements die sind aussen vor. Interessanterweise nur bei den "grossen" Umlauten. Ich lese ja das IFS File als String ein. Muss mir das Ganze nochmals genauer anschauen.
kf
-
Wie liest du die Daten aus dem IFS denn ein?
Erfolgt dabei dann tatsächlich eine Umsetzung?
Ggf. verwende einen UCS2-String im Programm (wird von XML-Into wohl unterstützt) und wandle mal mit %UCS2 vorher um. Überprüfe die Hexzeichen mal auf Kompatibilität mit deiner Job-CCSID (ich hoffe du hast eine).
Similar Threads
-
By Stoeberl in forum NEWSboard Programmierung
Antworten: 8
Letzter Beitrag: 10-01-07, 10:58
-
By oopsy-dear in forum IBM i Hauptforum
Antworten: 13
Letzter Beitrag: 11-11-05, 12:55
-
By b.horstmann in forum NEWSboard Programmierung
Antworten: 15
Letzter Beitrag: 12-10-05, 11:26
-
By Ralle in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 25-07-05, 14:58
-
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
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks