admin Founder


Registrato: Oct 03, 2008 Messaggi: 261
|
Inviato: Mer Apr 15, 2009 12:01 am Oggetto: [C] Base64 encode/decode |
|
|
Due funzioncine scritte al volo che possono considerarsi come un porting in C delle base64_encode e base64_decode del PHP per la codifica e la decodifica di stringhe in base64. L'unica vera difficoltàsta nel gestire i dati in base64, codificarli e decodificarli, considerando che sono dati a 6 bit mentre invece il linguaggio gestisce al minimo informazioni da 8 bit, ma con un po' di artifici e operatori bitwise si riesce.
| Codice: | /*
* Two functions that allow you to use base64_encode and base64_decode as the
* PHP-like functions to encode or decode your string
*
* by BlackLight, copyleft 2008
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* base64_encode (char *s) {
typedef struct {
unsigned char g1:2,
g2:6;
} tmp1;
typedef struct {
unsigned char g1:4,
g2:4;
} tmp2;
typedef struct {
unsigned char g1:6,
g2:2;
} tmp3;
char chars[] = {
'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','+','/'
};
tmp1 t1;
tmp2 t2;
tmp3 t3;
char val,*enc = (char*) malloc((int) ((4*3)*strlen(s)+2));
int i;
memset (&t1,0,sizeof(t1));
memset (&t2,0,sizeof(t2));
memset (&t3,0,sizeof(t3));
for (i=0; i<strlen(s); i++) {
if (!(i%3)) {
memcpy (&t1, &s[i], 1);
val = chars[t1.g2];
sprintf (enc,"%s%c",enc,val);
} else if ((i%3) == 1) {
memcpy (&t2, &s[i], 1);
val = chars[(t1.g1 << 4) + t2.g2];
sprintf (enc,"%s%c",enc,val);
} else if ((i%3) == 2) {
memcpy (&t3, &s[i], 1);
val = chars[(t2.g1 << 2) + t3.g2];
sprintf (enc,"%s%c",enc,val);
val = chars[t3.g1];
sprintf (enc,"%s%c",enc,val);
}
if (i==strlen(s)-1) {
if (!(i%3))
sprintf (enc,"%s%c==",enc,chars[t1.g1 << 4]);
else if ((i%3) == 1)
sprintf (enc,"%s%c=",enc,chars[t2.g1 << 2]);
}
}
return enc;
}
char* base64_decode (char *s) {
int i,j;
char chars[] = {
'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','+','/'
};
char *dec = (char*) malloc(strlen(s));
int *vals = (int*) malloc(strlen(s)*sizeof(int));
for (i=0; i<strlen(s) && s[i]!='='; i++) {
for (j=0; j<64; j++) {
if (chars[j]==s[i]) {
vals[i]=j;
break;
}
}
}
for (i=0; i<strlen(s) && s[i]!='='; i++) {
if (!(i%4))
sprintf (dec,"%s%c",dec,(vals[i] << 2) + ((vals[i+1] & 0x30) >> 4));
else if ((i%4) == 1)
sprintf (dec,"%s%c",dec,((vals[i] & 0xf) << 4) + ((vals[i+1] & 0x3c) >> 2));
else if ((i%4) == 2)
sprintf (dec,"%s%c",dec,((vals[i] & 0x3) << 6) + (vals[i+1]));
}
return dec;
}
main (int argc, char **argv) {
printf ("%s\n", (argv[1]) ? base64_encode(argv[1]) : "Argument expected");
printf ("%s\n", base64_decode(base64_encode(argv[1])));
} |
By BlackLight |
|