Base64

harja 01.07.04 16:23

Enkoodaa/dekoodaa base64-stringejä

 Tekstiversio  Arvo: 1 (7 ääntä)  Äänestä: +  -
/**
 * base64.c
 * Toteuttaa Base64 enkoodauksen ja dekoodauksen käyttäen lookup-tableja
 * Speksit löytyvät RCF1341:stä
 * (c) 2004 Mikko harju <maharj@utu.fi>
 */


#include <stdio.h>

/* Enkoodaukseen käytettävä lookup table */
char base64encode_lut[] =
{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q',
'R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h',
'i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y',
'z','0','1','2','3','4','5','6','7','8','9','+','/','='};

/* dekoodaukseen käytettävä lookup table */
char base64decode_lut[] =
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0,62, 0, 0, 0,63,52,53,54,55,56,57,58,59,60,61, 0, 0,
0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};

/* enkoodaa base64:ksi.
 * src = lähde
 * dest = kohde
 * len = kohteen puskurin koko */

void base64encode(char *src, char *dest, int len)
{
  int i=0, slen=strlen(src);
  for(i=0;i<slen && i<len;i+=3,src+=3)
  {
    /* Enkoodaa seuraavat 4 kirjainta bas64:ksi */
    *(dest++)=base64encode_lut[(*src&0xFC)>>0x2];
    *(dest++)=base64encode_lut[(*src&0x3)<<0x4|(*(src+1)&0xF0)>>0x4];
    *(dest++)=((i+1)<slen)?base64encode_lut[(*(src+1)&0xF)<<0x2|(*(src+2)&0xC0)>>0x6]:'=';
    *(dest++)=((i+2)<slen)?base64encode_lut[*(src+2)&0x3F]:'=';
  }
  dest='\0';
}

/* dekoodaa plaintekstiksi
 * src = lähde
 * dest = kohde
 * len = kohteen puskirin koko */

void base64decode(char *src, char *dest, int len)
{
  int i=0, slen=strlen(src);
  for(i=0;i<slen&&i<len;i+=4,src+=4)
  {
    /* otetaan talteen väliaikaismuuttujiin, ettei koodista tule liian rumaa */
    char c1=base64decode_lut[*src], c2=base64decode_lut[*(src+1)], c3=base64decode_lut[*(src+2)], c4=base64decode_lut[*(src+3)];

    /* Dekoodaa seuraavat kolme kirjainta */
    *(dest++)=(c1&0x3F)<<0x2|(c2&0x30)>>0x4;
    *(dest++)=(c3!=64)?((c2&0xF)<<0x4|(c3&0x3C)>>0x2):'\0';
    *(dest++)=(c4!=64)?((c3&0x3)<<0x6|c4&0x3F):'\0';
  }
  dest='\0';
}

/* Testausfunktio */
int main(int argc, char** argv)
{
  char srcbuf[255]={0}, destbuf[512]={0};
  if(argc<2) return 1;
  strncpy(srcbuf, argv[1], 255);
  base64encode(srcbuf, destbuf, 255);
  printf("%s => %s\n", srcbuf, destbuf);
  base64decode(destbuf, srcbuf, 255);
  printf("%s => %s\n", destbuf, srcbuf);
  return 0;
}

 

Babushka 16:28 4.7.04 
Tätäpä olisin tarvinnut pari kuukautta sitten =) Noo, tein itse, mutta tämä on huomattavasti kompaktimpi. Ei ehkä kovin helppolukuista koodia, mutta toisaalta eipä sen niin väliäkään tällaisessa simppelissä en/decoodauksessa.