Eli, minulla on nyt char-tyyppisessä muuttujassa eräs tiedosto base64-enkoodattuna. Tämä tiedosto tulisi nyt sitten dekoodata takaisin ja kirjottaa se tiedostoon.
Kirjoitan datan tiedostoon näin:
FILE *f = fopen("xxxx.xxx", "w"); fwrite(dataencode, koko, 1, f); fclose(f);
Ja dekoodauksen näin:
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) { char c1=base64decode_lut[*src], c2=base64decode_lut[*(src+1)], c3=base64decode_lut[*(src+2)], c4=base64decode_lut[*(src+3)]; *(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'; }
Ja muuttuja:
char* data="TVRoZAAAAAYAAAABAPBNVHJrAAAeQQD/UQMHoSAAwFEA/yABAAD/IAEJeJkof3iJKEB4mSh/eIkoQ...";
Mutta tässä nyt mättää joku. Datan dekoodaan uuteen char-muotoiseen muuttujaan ja sitten yritän kirjoittaa tämän muuttujan datan tiedostoon. Nyt sitten ohjelma kaatuu ennen kuin kykenee edes suorittumaan. Mutta kun poistan dekoodauksen, ohjelma suorittuu.
Voisitte myös kertoa, ovatko nämä koodit tarpeeksi datan dekoodaukseen ja sen kirjoittamiseen.
Veikkaan, että et ole alustanut osoitinta, jonka annat base64encode():n toiseksi parametriksi, tai olet varannut muistia liian vähän. Miten määritellet tämän "uuden char-muotoisen muuttujan"? Sehän on siis vain osoitin muistialueelle, jolla varsinainen merkkijonodata sijaitsee.
Eli siis alustetaanko tämä osoitin sitten näin, vai teenkö tässä nyt jonkun virheen.
char *dataencode;
Et alusta osoitinta tuossa mitenkään. Pelkästään tuolla tavoin määritelty osoitin osoittaa minne sattuu muistissa ja ohjelmasi kaatuu. Sinun pitää varata tarvittava määrä muistia ja laitettava osoittimesi viittaamaan varaamaasi muistinpätkylään.
char * datanode; /* Varataan muistia (C-tyylinen) */ datanode = (char*)malloc(tarvittava_muistin_määrä); /* C++ */ datanode = new char[tarvittava_muistin_määrä]; /* Käytön jälkeen muistin vapautus free() tai delete */
Myös rivi dest='\0'
on väärin, koska sijoitat nollan osoittimeen etkä muistipaikkaan. Lisää tuohon tähti.
Jos et tarvitse tuota enkoodattua dataa enää, voit dekoodata datan sen päälle. Neljästä base64-merkistä tulee kolme lopullista merkkiä, joten tila riittää aina ja uusi data ei mene purettavan päälle:
TW9pLCB0ZXN0aWRhdGFhLi4u\0 Moi LCB0ZXN0aWRhdGFhLi4u\0 Moi, t ZXN0aWRhdGFhLi4u\0 Moi, test aWRhdGFhLi4u\0 Moi, testida dGFhLi4u\0 Moi, testidataa Li4u\0 Moi, testidataa... \0 Moi, testidataa...\0
Voit siis tehdä näin:
void base64decode(char *src) { char *dest = src; // tuo koodisi, ja lopussa korjaus: *dest = 0; } char *data = "TW9pLCB0ZXN0aWRhdGFhLi4u"; base64decode(data); printf("%s\n", data); // Moi, testidataa...
Aihe on jo aika vanha, joten et voi enää vastata siihen.