[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
-----------------------------------------------------------------------