[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: BASE64
Thanks Charles,
I hadn't thought of splitting it up.
Cheers,
-David.
-----Original Message-----
From: ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx [mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of Charles Wilt
Sent: Thursday, January 30, 2014 1:33 PM
To: HTTPAPI and FTPAPI Projects
Subject: 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 <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: ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx [mailto:
> ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of
> thomas.raddatz@xxxxxx
> Sent: Thursday, January 30, 2014 12:22 AM
> To: 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: 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.
>
> tpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx schrieb am 30.01.2014 07:28:56:
>
> > Von: sk@xxxxxxxxxxxxxxxx
> > An: ftpapi@xxxxxxxxxxxxxxxxxxxxxx,> Datum: 30.01.2014 07:47
> > Betreff: Re: BASE64
> > Gesendet von: 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:
> > > 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
> > --------------------------------------------------------------------
> > --
> > -
>
>
> --
> 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:
> 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
-----------------------------------------------------------------------