| Uutiset | Koodikirjasto | Wiki | Keskustelut | FAQ | Info |
Base64harja 01.07.04 16:23 Enkoodaa/dekoodaa base64-stringejä
/** * 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. |
![]() Haku
|