SEARCH THE RFC INDEX
base64.c TOGGLE (show/hide this piece of code)

#include "base64.h"

DWORD base64_encode(char *iBuf, DWORD lBuf, char *oBuf){
  DWORD rBytes;
  BYTE  mBytes[ ] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  BYTE  iBytes[3];
  BYTE  oBytes[4];
  char *LocalBuf;
  DWORD LocalBufLen;
  DWORD x, z;

  rBytes = 0;
  LocalBufLen = lBuf;
  LocalBuf = LocalAlloc(LPTR, LocalBufLen);
  if(!LocalBuf){
    SetLastError(1);
    return 0;
  }

  memcpy(LocalBuf, iBuf, lBuf);

  z = 0;
  for(x = 0 ; x < lBuf ; x += 3){
    iBytes[0] = LocalBuf[x+0];
    iBytes[1] = LocalBuf[x+1];
    iBytes[2] = LocalBuf[x+2];

    oBytes[0] = ((iBytes[0]     ) >> 2);
		oBytes[1] = ((iBytes[0] & 3 ) << 4) | (iBytes[1] >> 4);
		oBytes[2] = ((iBytes[1] & 15) << 2) | (iBytes[2] >> 6);
		oBytes[3] = ((iBytes[2] & 63));

    if(x+1 >= lBuf){
      oBytes[2] = 64;
      oBytes[3] = 64;
    }else if(x+1 >= lBuf){
      oBytes[3] = 64;
    }

    oBuf[z++] = mBytes[oBytes[0]];
    oBuf[z++] = mBytes[oBytes[1]];
    oBuf[z++] = mBytes[oBytes[2]];
    oBuf[z++] = mBytes[oBytes[3]];
  }
  rBytes = z;

  LocalFree(LocalBuf);

  return rBytes;
}

DWORD base64_decode(char *iBuf, char *oBuf, DWORD lBuf){
  DWORD rBytes;
  BYTE  mBytes[ ] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  BYTE  iBytes[4];
  BYTE  oBytes[3];
  char *LocalBuf;
  DWORD LocalBufLen;
  BYTE  y;
  DWORD x, z;

  rBytes = 0;
  LocalBufLen = strlen(iBuf)+10;
  LocalBuf = LocalAlloc(LPTR, LocalBufLen);
  if(!LocalBuf){
    SetLastError(1);
    return 0;
  }

  strcpy(LocalBuf, iBuf);
  for(x = 0 ; x < strlen(LocalBuf) ; x++);
  while(strlen(LocalBuf)%4){
    LocalBuf[x++] = '=';
  }
  LocalBufLen = strlen(iBuf);

  z = 0;
  for(x = 0 ; x < strlen(LocalBuf) ; x += 4){
    for(y = 0 ; mBytes[y] != LocalBuf[x+0] ; y++);
    iBytes[0] = y;
    for(y = 0 ; mBytes[y] != LocalBuf[x+1] ; y++);
    iBytes[1] = y;
    for(y = 0 ; mBytes[y] != LocalBuf[x+2] ; y++);
    iBytes[2] = y;
    for(y = 0 ; mBytes[y] != LocalBuf[x+3] ; y++);
    iBytes[3] = y;

    oBytes[0] = ((iBytes[0] << 2)       | (iBytes[1] >> 4));
		oBytes[1] = ((iBytes[1] & 15) << 4) | (iBytes[2] >> 2);
		oBytes[2] = ((iBytes[2] &  3) << 6) | (iBytes[3]);

    oBuf[z++] = oBytes[0];
    if(iBytes[2] != 64)
      oBuf[z++] = oBytes[1];
    if(iBytes[3] != 64)
      oBuf[z++] = oBytes[2];
  }
  rBytes = z;

  LocalFree(LocalBuf);

  return rBytes;
}


			

base64.h TOGGLE (show/hide this piece of code)
sample.c TOGGLE (show/hide this piece of code)