Hexadecimalni soustava part 2

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: BabCA SjEs
Datum: 21.6.2006
Hodnocení/Hlasovalo: 0/0

Jednoduchy prevadec z hexadecimalni soustavy do znakove soustavy ASCII

Slovo Uvodem

Zaprve bych se vam chtel omluvit, ze to trvalu tak dlouho, ale nebylo moc casu. Dale bych jen vytknul chovani nekterych lidi zde. Pripadali jste mi jak deti ze skolky, kterym kdyz ucitelka da nejakou hracku tak se kazdej predvadi, aby toho dosahl vic nez ostatni. Tuto kritiku si nemusite brat k srdci a urcite vas nechci prudit, ale chtelo by se to naucit chovat :).

 

Vzhuru do toho

Tak pokud si nekteri jeste vzpomenou na muj prvotni clanek o tom jak vytvorit mali prevodnik z ASCII do  hexadecimalni soustavy (pro ty mene vzdelany hexa=6 decimal=10 => 16tkova soustava 8)) tak mam dobrou zpravu. Zde si muzete stahnout prevodnik z hexadecimalni soustavi do znakove sady ASCII. Znovu budeme potrebovat nejaky Ceckovy kompilator a to jest vse :).

 

Zdrojovy Kod

program #2

*
/*             Dekoder z hexadecimalni soustavy do desitkove soustavy
/*
/*             Verze: 1.0.0
/*
/*             Autor: BABCA SJES
/*
/*             License: open source
*/

#include <stdio.h>

int z_hex(int hex_cislo){
    /*funkce prevadi hexadecimalni cisla na normalni desitkovou sadu*/

    switch(hex_cislo){
        case '0' : return (0);
        case '1' : return (1);
        case '2' : return (2);
        case '3' : return (3);
        case '4' : return (4);
        case '5' : return (5);
        case '6' : return (6);
        case '7' : return (7);
        case '8' : return (8);
        case '9' : return (9);
        case 'a' : return (10);
        case 'A' : return (10);
        case 'b' : return (11);
        case 'B' : return (11);
        case 'c' : return (12);
        case 'C' : return (12);
        case 'd' : return (13);
        case 'D' : return (13);
        case 'e' : return (14);
        case 'E' : return (14);
        case 'f' : return (15);
        case 'F' : return (15);
    default:
        ;
}
}


main(){
    /*
    /* Hlavni funce, prebira znaky ze vstupu mezery nahrazuje mezerou.
    /* Hex. cisla prevadi na ASCII znakovou sadu.
    /* Maximalni velikost textu je dva tisice znaku.
    */

    int i,j;     /* int indexovych polozek*/
    int polozky[2000];     /* int pole znaku */
    int vstup, vstup2;     /* int ASCII cisla vstupujicich znaku */
    i=0;j=0; /* Nulovani indexovych znaku */

    printf("Zadejte hexadecimalni text (pr.: A1 65 .. ..):\n");

    /*
    /* Analiza vstupu, prebira vlozene hexadecimalni znaky
    /* a prevadi je na ASCII znakovou sadu.
    /* Tyto hodnoty pak uklada do pole.
    */

    while ((vstup=getchar()) != '\n'){
        i++;
        if (vstup != ' '){
            vstup2=getchar();
            vstup=z_hex(vstup);
            vstup2=z_hex(vstup2);
            polozky[i]=((vstup*16)+vstup2);     /*vzorec pro vypocteni z 16 -> 10 */
            /*printf("%c\t\t%d\n", polozky[i],i);*/     /* Debug */
        }
        else if (vstup == ' '){
            polozky[i]=32;     /* Vloz do aktualni pozice mezeru */
            /*printf("%c\t\t%d\n", polozky[i],i);*/     /* Debug */
        }
    }


    polozky[i+1]=9999;     /* Na konec pridej ukoncovaci znak */

    /* Cyklus pro vytisteni znaku */

    while (1==1){
        j++;
        if (polozky[j] == 9999)     /* Kontrola ukocujiciho znaku */
            break;
        printf ("%c", polozky[j]);     /* Tiskne ASCII znak */
    }
    printf ("\n-_-_-_-_-_-_-Stisknete ENTER pro ukonceni programu-_-_-_-_-_-_-");
    getchar();
    return(0);    /*neco pro stoury*/
}
 

Rozbor kodu

Asi hned na zacatku vas zaujme funkce z_hex(int hex_cislo). Funkce prebira jedno pismeno/cislo z hexadecimalniho cisla a pomoci funkce switch() toto cislo prevadi do normalni decimalni soustavy a pote toto decimalni cislo "vrati". Mozna na toto existuje nejaka vestavena funkce, ale me si ji nechtelo hledat :). Respektive misto funkce switch se mohlo pouzit if ((hex_cislo == 'a') || (hex_cislo='A')) a usetrit  tak kapku mista hold zalezi na vkusu. Ve funkci main() zezacatku deklarujeme promeny, vsimete si, ze jsem pouzil pole. Proc? K tomu se dostaneme pozdeji. Hned prvni ciklus je zvlastni. Prvni podminka se vykona, pokud se aktualni znak nebude rovnat mezere (tedy pokud by zapis vypadal takto 363738 => vystup 678). Pokud tedy vime , ze znak nejni mezera muzeme si pribrat i dalsi (pokud je zapis 36 37 38 tak vime ze na 100% nebude za trojkou nasledovat mezera a muzeme pribrat nasledujici znak tedy napr.: 6). Timto jsme ziskali hexadecimalni cislo rozdelene na dva znaky (36 -> 3 a 6), jelikoz je to porat hexadecka tak musime ziskat jejich ciselnou hodnotu (z A ->10 atd), k tomuto mame nasi funkci z_hex(hex_cislo). Nyni mame ciselne hodnoty a podle vzorce: prvni_znak*16 + druhy_znak (tedy z A a 1 [A=10] -> 10*16 +1 = 161 => í) jsme ziskaly ASCII kod konecneho znaku, ktery ulozime do pole pod poradovim indexem. Pote je zde jeste kontrola pro mezeru, jestlize je v textu mezera (v ASCII = 32) vloz ji do seznamu na index, pote zase pokracuje ciklus. V okmaziku, kdy se ukonci pridame jeste znameni pro program ze jsme ukocily pridavani cisel do pole, tedy zapisem na posledni pozici cislo 9999 (toto ciso jsem zvolil nahodne). Nasleduje dalsi ciklus, ktery uz vytiskne dekodovany znaky. Tedy pokud nejni na indexu v poli umisten nas ukoncovaci znak (u nas 9999) pokud ano ukonci program pokud ne tiskne dale znaky umistene v poli. Toto vse nic tak hroznyho :)

Slovo zaverem

Tento kod nejni zrovna nejlepsi, ale porad lepsi tohle naz dratem do oka :). Nejni tam kontrola spravnosti zadani tak pokud tam budete psat hovadinky typu "ah oj" tak se musite smirit s nasledkama :o). To jest nejspise vse. Tak zatim zdar :)

ps: Pokud mate nejake nejastnosti prectete si clanek Hexadecimalni soustava (part 1)

                                                           <$] Babca Sjes [$>