Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Base64 dekoodaus

Marope [24.07.2008 20:00:57]

#

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.

hunajavohveli [24.07.2008 20:52:34]

#

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.

Marope [24.07.2008 20:58:49]

#

Eli siis alustetaanko tämä osoitin sitten näin, vai teenkö tässä nyt jonkun virheen.

char *dataencode;

sqwiik [24.07.2008 22:01:19]

#

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 */

Metabolix [25.07.2008 08:15:52]

#

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...

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta