C++ Builder Snippets  

Base64-Kodierung (fuer AnsiString):
 
//-----------------------------------------------------------------------
// Kodiert String in base64-Format (Algorithmus aus dem FAQ auf BCBDEV.COM, 
// angepasst für AnsiStrings NO COMMENT :). Wer binäre Daten kodieren will, 
// schaut lieber auf bcbdev.com nach)
//-----------------------------------------------------------------------
// Parameter:    kodierender String als AnsiString
// Rückgabewert: kodierter String als AnsiString
//-----------------------------------------------------------------------
AnsiString Base64Encod(AnsiString slToEnc)
{
  //Base64-Tabelle besteht aus 64 druckbaren Zeichen:
  const char Base64Table[64]=
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  char * buftoenc = slToEnc.c_str();
  int bufsize = slToEnc.Length() + 1;
  char * encbuf = new char[slToEnc.Length() * 5];
  encbuf[0] = '\0';  int ilStrLen = -1;
  int i=0int b64byte[5];
  unsigned char *buftemp;
  AnsiString slRetVal = EmptyStr;

  //Speicher für den temporären String reservieren:
  buftemp=(unsigned char *)malloc(bufsize+2);
  strcpy(buftemp,buftoenc);
  if (fmod(bufsize,3)==1)
  {
    buftemp[bufsize]='\0';
    buftemp[bufsize+1]='\0';
  }
  if (fmod(bufsize,3)==2)buftemp[bufsize]='\0';
  while (i<bufsize)
  {
    b64byte[0]=buftemp[i]>>2;
    b64byte[1]=((buftemp[i]&3)<<4)|(buftemp[i+1]>>4);
    b64byte[2]=((buftemp[i+1]&0x0F)<<2)|(buftemp[i+2]>>6);
    b64byte[3]=buftemp[i+2]&0x3F;
    encbuf[i+(i/3)]=Base64Table[b64byte[0]];
    encbuf[i+(i/3)+1]=Base64Table[b64byte[1]];
    encbuf[i+(i/3)+2]=Base64Table[b64byte[2]];
    encbuf[i+(i/3)+3]=Base64Table[b64byte[3]];
    i+=3;
  }
  free(buftemp);
  if (fmod(bufsize,3)==0) ilStrLen = bufsize*8/6;
  else if (fmod(bufsize,3)==1) ilStrLen = ((bufsize+2)*8/6)-2;
  else if (fmod(bufsize,3)==2) ilStrLen = ((bufsize+1)*8/6)-1;
  else ilStrLen = -1;
  if(ilStrLen > 0) slRetVal = AnsiString(encbuf).SubString(1, ilStrLen);
  if(encbuf != NULL) { delete encbuf; encbuf = NULL; }
  return slRetVal;
}


//-----------------------------------------------------------------------
// Dekodiert string aus dem base64-Format.
//-----------------------------------------------------------------------
// Parameter:    zu dekodierender String als AnsiString
// Rückgabewert: dekodierter String als AnsiString
//-----------------------------------------------------------------------
AnsiString Base64Decod(AnsiString slToDec)
{
  //Base64-Tabelle besteht aus 64 druckbaren Zeichen:
  const char Base64Table[64]=
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  char * buftodec = slToDec.c_str();
  int bufsize = slToDec.Length() + 1;
  char * decbuf = new char[slToDec.Length() * 5];
  decbuf[0] = '\0';  int ilStrLen = -1;
  AnsiString slRetVal = EmptyStr;

  int i=0unsigned char binbyte[4];
  int cpos[5]; unsigned char *buftemp;
  //Speicher für den temporären String reservieren:
  buftemp=(unsigned char *)malloc(bufsize);
  strcpy(buftemp,buftodec);
  if (fmod(bufsize,4)==1)
  {
    buftemp[bufsize]='\0';
    buftemp[bufsize+1]='\0';
    buftemp[bufsize+2]='\0';
  }
  if (fmod(bufsize,4)==2)
  {
    buftemp[bufsize]='\0';
    buftemp[bufsize+1]='\0';
  }
  if (fmod(bufsize,4)==3)buftemp[bufsize]='\0';
  while (i<bufsize)
  {
    cpos[0]=strchr(Base64Table,buftemp[i])-Base64Table;
    cpos[1]=strchr(Base64Table,buftemp[i+1])-Base64Table;
    cpos[2]=strchr(Base64Table,buftemp[i+2])-Base64Table;
    cpos[3]=strchr(Base64Table,buftemp[i+3])-Base64Table;
    binbyte[0]=((cpos[0]<<2)|(cpos[1]>>4));
    binbyte[1]=((cpos[1]<<4)|(cpos[2]>>2));
    binbyte[2]=(((cpos[2]&0x03)<<6)|(cpos[3]&0x3f));
    decbuf[i-(i/4)]=binbyte[0];
    decbuf[i-(i/4)+1]=binbyte[1];
    decbuf[i-(i/4)+2]=binbyte[2];
    i+=4;
  }
  free(buftemp);
  if (fmod(bufsize,4)==0) ilStrLen = bufsize*6/8;
  else if (fmod(bufsize,4)==1) ilStrLen = ((bufsize+3)*6/8)-3;
  else if (fmod(bufsize,4)==2) ilStrLen = ((bufsize+2)*6/8)-2;
  else if (fmod(bufsize,4)==3) ilStrLen = ((bufsize+1)*6/8)-1;
  else ilStrLen = -1;
  if(ilStrLen > 0) slRetVal = AnsiString(decbuf).SubString(1, ilStrLen);
  if(decbuf != NULL) { delete decbuf; decbuf = NULL; }
  return slRetVal;
}



© '99-2000 by S. Kreutzmann