[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: BASE64



   You can decode BASE64 in chunks..
   Just make sure all chucks but the last are multiples of 3 bytes.
   Charles

   On Thu, Jan 30, 2014 at 2:55 PM, David Baugh <[1]davidb@xxxxxxxxxxxxxx>
   wrote:

     Thanks guys,
     Yes you hit the nail on the head Thomas. I have a variety of
     different files of varying sizes. Some may be 15k, others may be
     5mb. If I set a constant of 5mb, Murphy's law states that I'll get
     one that's bigger (too bad) and I'd prefer to avoid  excessive
     allocation (5mb for one of the little guys). Therefore looking for
     method of approximating size of the space needed by the base64
     routine on the fly.
     Thanks for the help!
     -David.

   -----Original Message-----
   From: [2]ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
   [mailto:[3]ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of
   [4]thomas.raddatz@xxxxxx
   Sent: Thursday, January 30, 2014 12:22 AM
   To: [5]ftpapi@xxxxxxxxxxxxxxxxxxxxxx
   Subject: Re: BASE64
   Scott,

     I assume that the problem is that David does not know that size of
     thedecoded data beforehand. The "5mb" value was just an example.
     David, you may either allocate the size of the Base64 encoded data
     orroughly calculate the size of the output buffer based on the size
     of theinput data. For the latter you may use the following
     procedure:

     // ---------------------------------------------------------
     //   Calculate maximum size of Base64 decoded data.
     //   (Size may be up to 2 bytes more than required, because
     //    we do not know the value of the last 2 bytes of
     //    the Base64 encoded data.)
     // ---------------------------------------------------------
    P getSizeBased64Decoded...
    P                 b
    D                 pi            10I 0
    D  sizeEncoded                  10I 0 value
     /free
        return (%int(sizeEncoded / 4) * 3);
     /end-free
    P                 e

     For the first option, your buffer is always 33% too large, because
     thesize of the encoded data is roughly 4 * n / 3. But the exact size
     isreturned by base64_decode().

   The counterpart of getSizeBased64Decoded() is:
     // ---------------------------------------------------------
     //   Calculate size of Base64 encoded data.

       //   See: [6]http://de.wikipedia.org/wiki/Base64

     // ---------------------------------------------------------
     //   Bei einem n Zeichen langen zu kodierenden Text beträgt
     //   der Platzbedarf für den Base64-kodierten Inhalt (ohne
     //   Zeilenumbrüche).
     //   Translated:
     //   For a given text of n bytes, the length of the Base64
     //   encoded output bytes is (without CRLF).
     //     sizeEnc = 4 * (n + 2 - ((n + 2) mod 3)) / 3
     // ---------------------------------------------------------
    P getSizeBased64Encoded...
    P                 b
    D                 pi            10I 0
    D  size                         10I 0 value
     /free
        return (4 * (size+2 - (%rem((size+2): 3))) / 3);
     /end-free
    P                 e
   It returns the exact size of the Base64 encoded data for a given
   inputsize.
   For example (where the size of the input data is 13, 14, 15, 16, 17 and
   18bytes):
   > call example41 'GermanChars13.txt'
     DSPLY  Size of encoded data: 20 (expected:20/15)
   > call example41 'GermanChars14.txt'
     DSPLY  Size of encoded data: 20 (expected:20/15)
   > call example41 'GermanChars15.txt'
     DSPLY  Size of encoded data: 20 (expected:20/15)
   > call example41 'GermanChars16.txt'
     DSPLY  Size of encoded data: 24 (expected:24/18)
   > call example41 'GermanChars17.txt'  DSPLY  Size of encoded data: 24
   > (expected:24/18) call example41 'GermanChars18.txt'  DSPLY  Size of
   > encoded data: 24 (expected:24/18)

     The results of getSizeBased64Encoded() and getSizeBased64Decoded()
     areshown after "expected:".

   Thomas.
   [7]tpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx schrieb am 30.01.2014 07:28:56:
   > Von: [8]sk@xxxxxxxxxxxxxxxx
   > An: [9]ftpapi@xxxxxxxxxxxxxxxxxxxxxx,> Datum: 30.01.2014 07:47
   > Betreff: Re: BASE64
   > Gesendet von: [10]ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
   >> David,
   >> As you mentioned in your e-mail, 'outsize' is the size of the
   output> variable.  So if your output variable is 5mb, then  pass 5mb
   in> outsize.   If you allocate memory to a pointer, 'outsize' should be
   the> size of memory you allocated.
   >> You seem to know this already, so I'm not sure what you're asking?
   >> -SK
   >>> On 1/29/2014 8:09 PM, David Baugh wrote:
   > >     Hi folks,
   > >
   > >
   > >     I'm getting a pdf using SOAP, then sending it through the
   BASE64
   > >     decoder and saving it to file. It works fine as long as the pdf
   is
   > >     small. I have my result variable outbuf defined as a
   largecharacter

     > >     string, which is not ideal but has worked so far since I
     know thePDF's

   > >     I've been importing. Now I need to cater to larger PDF's.
   > >
   > >
   > >     I'm setting theBASE64 output size is the size of that variable.
   > >
   > >
   > >     From BASE64_H: OutSize = (input) size of area to store output
   in
   > >
   > >

     > >     In order to cope with large PDF's (i.e. let's go crazy and
     say5mb), If

   > >     I define the output variable as a pointer in my program, how do
   I
   > >     determine Outsize on the call to BASE64?
   > >
   > >
   > >     Here's the snippet:
   > >
   > >
   > >     outlen = base64_decode( value.buf
   > >
   > >                           : value.len
   > >
   > >                           : %addr(outbuf)
   > >
   > >                           : %size(outbuf) );
   > >
   > >
   > >          callp write(fd3: %addr(outbuf): outlen);
   > >
   > >
   > >     Thanks,
   > >
   > >
   > >     -David.
   > >
   > >
   > >
   >
   >---------------------------------------------------------------------

     > >--  This is the FTPAPI mailing list.  To unsubscribe, please go
     to:
     > > [11]http://www.scottklement.com/mailman/listinfo/ftpapi
     >
     >-------------------------------------------------------------------
     --
     > >--
     >>
     --------------------------------------------------------------------
     -

   >> --
   > This is the FTPAPI mailing list.  To unsubscribe, please go to:

     > [12]http://www.scottklement.com/mailman/listinfo/ftpapi
     >
     --------------------------------------------------------------------
     --

   > -
   --
   IMPORTANT NOTICE:
   This email is confidential, may be legally privileged, and is for the
   intended recipient only. Access, disclosure, copying, distribution, or
   reliance on any of it by anyone else is prohibited and may be a
   criminal offence. Please delete if obtained in error and email
   confirmation to the sender.

   -----------------------------------------------------------------------
   This is the FTPAPI mailing list.  To unsubscribe, please go to:

     [13]http://www.scottklement.com/mailman/listinfo/ftpapi
     --------------------------------------------------------------------
     ---

References

   1. mailto:davidb@xxxxxxxxxxxxxx
   2. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
   3. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
   4. mailto:thomas.raddatz@xxxxxx
   5. mailto:ftpapi@xxxxxxxxxxxxxxxxxxxxxx
   6. http://de.wikipedia.org/wiki/Base64
   7. mailto:tpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
   8. mailto:sk@xxxxxxxxxxxxxxxx
   9. mailto:ftpapi@xxxxxxxxxxxxxxxxxxxxxx
  10. mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
  11. http://www.scottklement.com/mailman/listinfo/ftpapi
  12. http://www.scottklement.com/mailman/listinfo/ftpapi
  13. http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------
This is the FTPAPI mailing list.  To unsubscribe, please go to:
http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------