Link to home
Start Free TrialLog in
Avatar of benson031397
benson031397

asked on

Base64 encoding C library for Unix.

Dear all,

I would like to do the base64 encoding programming in Unix.  Can anyone tell me where I can get such library function call to do?


Thanks!
Benson
Avatar of Axter
Axter
Flag of United States of America image

The following is a pair of encode and decode functions.

#define OK                  (0)
#define FAIL                (-1)
#define BUFOVER             (-2)
#define CHAR64(c)           (((c) < 0 || (c) > 127) ? -1 : index_64[(c)])
static char     basis_64[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????";
static char     index_64[128] = {
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
   52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
   -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
   15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
   -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
   41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1
};






int             encode64(const char *_in, unsigned inlen,
                       char *_out, unsigned outmax, unsigned *outlen)
{

   const unsigned char *in = (const unsigned char *) _in;
   unsigned char  *out = (unsigned char *) _out;
   unsigned char   oval;
   char           *blah;
   unsigned        olen;

   olen = (inlen + 2) / 3 * 4;
   if (outlen)
       *outlen = olen;
   if (outmax < olen)
       return BUFOVER;

   blah = (char *) out;
   while (inlen >= 3)
   {
/* user provided max buffer size; make sure we don't go over it */
       *out++ = basis_64[in[0] >> 2];
       *out++ = basis_64[((in[0] << 4) & 0x30) | (in[1] >> 4)];
       *out++ = basis_64[((in[1] << 2) & 0x3c) | (in[2] >> 6)];
       *out++ = basis_64[in[2] & 0x3f];
       in += 3;
       inlen -= 3;
   }
   if (inlen > 0)
   {
/* user provided max buffer size; make sure we don't go over it */
       *out++ = basis_64[in[0] >> 2];
       oval = (in[0] << 4) & 0x30;
       if (inlen > 1)
           oval |= in[1] >> 4;
       *out++ = basis_64[oval];
       *out++ = (inlen < 2) ? '=' : basis_64[(in[1] << 2) & 0x3c];
       *out++ = '=';
   }

   if (olen < outmax)
       *out = '\0';

   return OK;

}




int             decode64(const char *in, unsigned inlen, char *out, unsigned *outlen)
{

   unsigned        len = 0,
                   lup;
   int             c1,
                   c2,
                   c3,
                   c4;

   if (in[0] == '+' && in[1] == ' ')
       in += 2;

   if (*in == '\0')
       return FAIL;

   for (lup = 0; lup < inlen / 4; lup++)
   {
       c1 = in[0];
       if (CHAR64(c1) == -1)
           return FAIL;
       c2 = in[1];
       if (CHAR64(c2) == -1)
           return FAIL;
       c3 = in[2];
       if (c3 != '=' && CHAR64(c3) == -1)
           return FAIL;
       c4 = in[3];
       if (c4 != '=' && CHAR64(c4) == -1)
           return FAIL;
       in += 4;
       *out++ = (CHAR64(c1) << 2) | (CHAR64(c2) >> 4);
       ++len;
       if (c3 != '=')
       {
           *out++ = ((CHAR64(c2) << 4) & 0xf0) | (CHAR64(c3) >> 2);
           ++len;
           if (c4 != '=')
           {
               *out++ = ((CHAR64(c3) << 6) & 0xc0) | CHAR64(c4);
               ++len;
           }
       }
   }

   *out = 0;
   *outlen = len;

   return OK;

}
Avatar of benson031397
benson031397

ASKER

Axter : Thanks for your help.  Can you briefly tell me the meaning of each argument?


Thanks!
Benson
encode64(const char *_in, unsigned inlen,
                      char *_out, unsigned outmax, unsigned *outlen)

Example code:

char MyMsg[] = "Hello World";

char DestinationBuf[1024];

int TotalEncodeLen;
encode64(MyMsg, sizeof(MyMsg), DestinationBuf, &TotalEncodeLen);

The above copde will encode MyMsg string.

To decode it use decode64.

int TotalDecodeLen;
decode64(SourceBuf, sizeof(SourceBuf), DestBuf, &TotalDecodeLen);
Axter : Thanks for your help.  Can you briefly tell me the meaning of each argument?


Thanks!
Benson
Axter : There are 5 arguments of encode64.  Your example is a bit different.
>>There are 5 arguments of encode64.  Your example is a
>>bit different.

I overlooked that.

encode64(
const char *_in, //Pointer to original string
unsigned inlen,  //Length of original string
char *_out, //Pointer to destination buffer
unsigned outmax, //Length of destination buffer
unsigned *outlen //Address of a variable that will be modified to take the new length of the buffer after encode is complete
);

char MyMsg[] = "Hello World";

char DestinationBuf[1024];

int TotalEncodeLen;
encode64(MyMsg, sizeof(MyMsg), DestinationBuf, sizeof(DestinationBuf), &TotalEncodeLen);
benson,
Did I answer your question?
Axter :  Yes!  Thank you very much :)
ASKER CERTIFIED SOLUTION
Avatar of Axter
Axter
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial