+ Reply to Thread
Results 1 to 4 of 4

Thread: Base64 v C

  1. #1

    Base64 v C

    Dobry den.
    Nejsem nejaky velky programator ale pokousim se udelat kodovani Base64 v C. Nebudu tajit ze to je ukol do skoly. Kod vpodstate uz mam spravne, ale problem je, ze zdrojak se kontroluje na fakultnim stroji podle norem c99 a jak jsem zjistil, muj kod nechce prevadet netisknutelne znaky ( neboli polovicni znaky jestli chapete co tim myslim, jestli ne tak z Windows na vstup spusteneho programu to jde zadat např. jako Ctrl+ě a objevi se neco jako ^@ ale je to jeden znak a na vystupu se objevi AA==, pro 2krat stisknutem Ctrl+ě se musi objevit AAA= a pro 3krat AAAA a ja prave nevim jak toho docilit.... snad je tomu rozumet ). Muj kod je:

    #include <stdio.h>
    #include <stdlib.h>

    int main(){
    unsigned char z = 0;
    unsigned char z2 = 0;
    unsigned char z3 = 0;
    char cb64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv wxyz0123456789+/=";

    printf("\nMene nez tremi znaky se program ukoncuje\n");

    do {
    z = 0;
    z2 = 0;
    z3 = 0;

    printf("\nZadej nejvyse tri znaky a zmackni Enter (←'): ");

    scanf("%c", &z);
    if ( (int) z == 10) { break; }

    scanf("%c", &z2);
    if ( (int) z2 != 10) {
    scanf("%c", &z3);
    if ( (int) z3 == 10) { z3 = 0;
    }else {
    unsigned char y = 0;
    scanf("%c", &y); }
    } else { z2 = 0; };

    unsigned int a = 0;
    unsigned int b = 0;
    unsigned int c = 0;
    unsigned int d = 0;


    a = z>>2;
    b = (((z & 3) << 4) | (z2 >> 4));
    c = (((z2 & 15) << 2) | (z3 >> 6));
    if ( c == 0 ) { c = 64; }
    d = z3 & 63;
    if ( d == 0 ) { d = 64; }

    printf("%c%c%c%c", cb64[a],cb64[b],cb64[c],cb64[d] );

    /*unsigned char y = 0;
    scanf("%c", &y);*/

    /*if ( (int) z3 == 10) {
    unsigned char y = 0;
    scanf("%c", &y); };*/


    } while ( (int) z != 10 && (int) z2 != 10 && (((int) z3 != 10) && ((int) z3 != 0 )));

    return 0;
    }

    kdyby me nekdo poradil, jak to mam dokoncit, byl bych vdecny. Dekuji za kazdou radu

  2. #2
    Ja by som to tipol na zle definovanú abecedu keďže máš medzi v a w medzeru ak ju odstrániš tak by to malo chodiť.
    A inak čo ti môžem poradiť:
    • použitie scanf na načítanie znaku je ako použitie traktora na prekyprenie pôdy v kvetináči v tvojej obývačke
    • z, z1, z2 by bolo lepšie nahradiť poľom a načítať znaky pomocou cyklu
    Možno je to jedno, ale možno ti za to strhnú body. Podľa toho čo sa u vás vyžaduje. Viem, že sa ti to prerábať nechce, ale ak by si sa chcel programovaniu aj venovať ta by bolo lepšie si to skúsiť prerobiť.

    Inak, ťa ctí, že si si to vypracoval sám. To je vzácny jav

  3. #3
    abecedu mam definovano dobre, to musel byt preklep, kdyz jsem to kpiroval...
    s tim printf jsem to asi vylepsil pomoci getchar(), teda doufam, ze jsem to vylepsil:

    if (( z = getchar()) =='\n') { break; }
    if (( z2 = getchar()) != '\n') {
    if ( (z3 = getchar()) == '\n') { z3 = 0;
    }else {
    unsigned char y = 0;
    y = getchar(); }
    } else { z2 = 0; };

    ale kdybys mi poradil jak udelat to pomoci pole, bych te pozval na pivo. Urcite vim, ze to bude:

    unsigned char pole[3];
    printf("Zadejte 3 hodnoty: ");
    gets(pole);
    printf("zadaly jste: %s", pole);

    ale pak jaky bude ten cyklus na to nacitani,to opradvdu netusim...

  4. #4

    base64 improving

    Takže:

    1) Na tie polia využívaj konštanty tie potom dôsledne používaj
    Code:
    #define MAX_ZNAKOV 3
    2) Nikdy nepoužívaj funkciu gets. Zabudni, že existuje a ak sa ti bude niekedy zdať, že ju potrebuješ tak použi fgets(stdin, pole, MAX_ZNAKOV), ktorá ti umožní kontrolovať počet načítaných znakov.

    3) Tu potrebuješ v každom prípade funkciu getchar, tá ale vracia int, nie char. Preto musíš znaky načítavať do typu int.
    Code:
    int ch;
    unsigned char znaky[MAX_ZNAKOV];
    
    // tu vynuluješ v cykle for pole znakov
    
    for(int i=0; i<MAX_ZNAKOV; ++i) {
      ch = getchar();
      if(ch == EOF || ch == '\n') { break; }
      else { znaky[i] = ch; }
    }
    4) Potom som si všimol, že si používal 10 namiesto '\n'. To nie je dobrý nápad a nebude ti to niekde fungovať. Vždy používaj znakové konštanty.

    5) No a chyba potom bude asi na konci v podmienkach
    Code:
    if(c == 0) { c = 64; }
    if ( d == 0 ) { d = 64; }
    Hoci je v premenných nula, ktorú si načítal tak ju prepíšeš na padding. Potom aj priradenie c = 64; nie je nič moc. Radšej si zase definuj konštantu a napíš zrozumiteľnejšie c = PADDING_INDEX; alebo niečo také. Budeš si jednoducho musieť pamätať koľko znakov si načítal a podľa toho pridáš padding, pretože aj nula je korektná hodnota znaku.

+ Reply to Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts