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
Bookmarks