[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: Base64 decode of a PNG file
I am pretty sure that you don't want the O_TEXTDATA when you open the IFS file.
Scott Mildenberger
-----Original Message-----
From: ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx [mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of Radu Botescu
Sent: Monday, February 23, 2015 9:10 AM
To: HTTPAPI and FTPAPI Projects
Subject: Base64 decode of a PNG file
Hello,
I call a Fedex webservice in order to retrieve a document in PNG format and print it.
But this document is base64 encoded.
Thanks to Scott's HTTPAPI I can call the webservice and parse the right XML element into a file in IFS.
So at this time I have a binary file in IFS:
- /tmp/fedex.bin ==> CCSID 819
- if I  copy/paste it in a online internet decoder I have no problem in getting back the PNG
- but on the AS400 I have no luck:
  - I've tried the openssl (opened QSHELL and put "openssl base64 -d -in /tmp/fedex.bin -out /tmp/fedex.png  ") ==> the result is a fedex.png with 0 bytes;
  - I've tried Scott's base64_decode (reading the IFS and writing the result in IFS)  ==> same result, a fedex.png with 0 bytes;
What I'm doing wrong...? :(
Thank you in advance for your help.
Here below the program using Scott's base64_decode (sorry in advance if my code is a mess...it is only a draft version..proof of concept kind of...):
H DFTACTGRP(*NO) BNDDIR('BASE64':'QC2LE')
 /copy BASE64_H
 /copy httpapi_h
 /copy ifsio_h
D BASE64DATA      s             72A   DIM(43) CTDATA PERRCD(1)
D ReportError     PR
D IFS_file2Var    pr         65535a   varying
D  pFile                       256a   value
D InputData       s          32767A   varying
D OutputData      s          32767A   varying
d decdata         s          32764a
d decoded         s          32764a
d declen          s             10i 0
d len             s             10i 0
D outputfile      s            200A
D outfile         s             10I 0
d rc              s             10i 0
d i               s             10i 0
D fd              S             10I 0
      // Declare the files
      InputData = IFS_file2Var('/tmp/fedex.bin');
      len = %len(InputData);
      outputfile = '/tmp/fedex.png';
      // Prepare the OUT file
      fd = open(outputfile
                    : O_WRONLY+O_CREAT+O_TRUNC+O_CCSID
                    : S_IRGRP + S_IWGRP + S_IXGRP +
                       S_IRUSR + S_IWUSR + S_IXUSR
                    : 819);
      callp close(fd);
     fd = open(outputfile:O_WRONLY+O_TEXTDATA);
     // decode InputData
     declen = base64_decode(%addr(InputData : *DATA )
                           : len
                           : %addr(OutputData : *DATA )
                           : %len(OutputData));
     // write it
     callp write(fd: %addr(OutputData): %len(OutputData));
     callp close(fd);
     *inlr = *on;
 **** IFS ==> variable pgm
P IFS_file2Var    b                   export
D IFS_file2Var    pi         65535a   varying
D  pFile                       256a   value
D open            pr            10i 0 extproc('open')
D  filename                       *   value options(*string)
D  openflags                    10i 0 value
D  mode                         10u 0 value options(*nopass)
D  codepage                     10u 0 value options(*nopass)
D  creatcnvid                   10u 0 value options(*nopass)
D read            pr            10i 0 extproc('read')
D  handle                       10i 0 value
D  buffer                         *   value
D  bytes                        10u 0 value
D close           pr            10i 0 extproc('close')
D  handle                       10i 0 value
D data            s          65535a
D bytesRead       s             10i 0
D handle          s             10i 0
D rc              s             10i 0
D O_RDONLY        c                   1
D O_TEXTDATA      c                   16777216
   handle = open(%trim(pFile): O_RDONLY+O_TEXTDATA);
   if handle < 0;
     // something is wrong
      return '';
   endif;
     bytesRead = read(handle: %addr(data): %size(data));
     if bytesRead <= 0;
     return '';
     endIf;
     rc = close(handle);
     return %trim(data);
P                 e
-----------------------------------------------------------------------
This is the FTPAPI mailing list.  To unsubscribe, please go to:
http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------