Programming Freaks  | دورات ومقالات برمجيه

Please login or register.

Login with username, password and session length
Advanced search  

News:

Please Read our FAQ

Author Topic: Hex2Decimal Decimal2Hex C Convertor | محول الاعداد السداسية عشر والعشريه بالسي  (Read 513 times)

St0rM

  • [C programmer]
  • Administrator
  • Active Member
  • *****
  • Posts: 209
  • Why So serious ?
    • View Profile
    • WWW
    • Email
برنامج صغير كل وظيفته انه يحول من الاعداد العشريه للسداسية عشر او العكس
لو عدلت فيه شوية تعديلات بسيطه هتقدر انك تستخدمه في تحويل اي نوع من انواع الارقام سداسية عشر ثنائيه رباعيه سباعيه اي حاجه للعشري او العكس
الفكره بسيطه جدا , تطبيقها عليك

Code: [Select]
#include <stdio.h>                               
#include <stdlib.h>                             
#include <string.h>                             
#include <math.h>                               
#include <unistd.h>                             

#define POWER ((len - through) - 1)

/* Static character pointer to the program name */
static char     *program_name;                   
/* Character of hexdecimal system */             
enum             hex{a=10,b,c,d,e,f};             
/* Verbose */                                     
int v = 0;                                       

void usage(const char *name)
{                           
        fprintf(stderr , "%s [option] number\n",name);
        fprintf(stderr , "options:\n"                 
                        "\t -t to hex\n"             
                        "\t -d to dec\n"             
                        "\t -v verbose\n");           
        exit(0);                                     
}                                                     

void to_hex(const char *number)
{                               
        long    digit = 0;     
        long    through = 1;   
        int     index = 0;     
        char    hexed[20];     

        digit = atol(number);

        if(digit == 0)
        {             
                printf("0H\n");
                return ;       
        }                     

        while(through <= digit)
                through *= 16;

        if(through > digit)
                through /= 16;

        while(through != 0)
        {                 

                int rem = digit / through;
                if(v)                     
                        printf("Deviding %ld / %ld\n",digit,through);

                switch(rem)
                {         
                        case 0:
                        case 1:
                        case 2:
                        case 3:
                        case 4:
                        case 5:
                        case 6:
                        case 7:
                        case 8:
                        case 9:
                                sprintf(&hexed[index++],"%d",rem);
                                break;                           
                        case 10:                                 
                                hexed[index++] = 'a';             
                                break;                           
                        case 11:                                 
                                hexed[index++] = 'b';             
                                break;                           
                        case 12:                                 
                                hexed[index++]= 'c';             
                                break;                           
                        case 13:                                 
                                hexed[index++] = 'd';             
                                break;                           
                        case 14:                                 
                                hexed[index++] = 'e';             
                                break;                           
                        case 15:                                 
                                hexed[index++] = 'f';             
                                break;                           
                }                                                 

                digit -= rem * through;
                through /= 16;         
        }                             
        hexed[index] = '\0';           
        printf("%sH\n",hexed);         
}                                     

void from_hex(const char *number)
{                               
        int     len = strlen(number);
        int     through = 0;         
        long  digit = 0;             

        if(len <= 0)
                usage(program_name);

        for(through = len - 1 ; through >= 0 ; through--)
        {                                               
                if(number[through] == 'h' || number[through] == 'H')
                        --len;                                     
                else                                               
                        break;                                     
        }                                                           

        for(through = len - 1 ; through >= 0  ; through--)
        {                                                 
                if(v)                                     
                        printf("Multiplaying %d with 16 ^ %d\n",number[through] - '0' , len - through);

                switch(number[through])
                {                     
                        case '0':     
                        case '1':     
                        case '2':     
                        case '3':     
                        case '4':     
                        case '5':     
                        case '6':     
                        case '7':     
                        case '8':     
                        case '9':     
                                 digit += (number[through] - '0' ) * (pow(16 , POWER));
                                break;                                                 
                        case 'A':                                                     
                        case 'a':                                                     
                                digit += a * pow(16 , POWER);                         
                                break;                                                 
                        case 'B':                                                     
                        case 'b':                                                     
                                digit += b * pow(16 , POWER);                         
                                break;                                                 
                        case 'C':                                                     
                        case 'c':                                                     
                                digit += b * pow(16 , POWER);                         
                                break;                                                 
                        case 'D':                                                     
                        case 'd':                                                     
                                digit += d * pow(16 , POWER);                         
                                break;                                                 
                        case 'E':                                                     
                        case 'e':                                                     
                                digit += e * pow(16 , POWER);                         
                                break;                                                 
                        case 'F':                                                     
                        case 'f':                                                     
                                digit += f * pow(16 , POWER);                         
                                break;                                                 
                        case 'H':                                                     
                        case 'h':                                                     
                                continue;                                             
                                break;                                                 
                        default:                                                       
                                usage(program_name);
                                break;

                }

        }

        printf("%ld\n",digit);

}

int main(int argc , char **argv)
{
        char    c;
        const char *optstring = "t:d:vh";
        program_name = argv[0];

        if(!argv[1])
        {
                usage(program_name);
        }

        while((c = getopt(argc,argv,optstring)) != -1)
        {
                switch(c)
                {
                        case 't':
                                to_hex(optarg);
                                break;
                        case 'd':
                                from_hex(optarg);
                                break;
                        case 'v':
                                v = 1;
                                break;
                        case 'h':
                                usage(program_name);
                                break;
                        default:
                                usage(program_name);
                                break;
                }
        }


        return 0;
}
Logged

St0rM

  • [C programmer]
  • Administrator
  • Active Member
  • *****
  • Posts: 209
  • Why So serious ?
    • View Profile
    • WWW
    • Email
Quote
a55k1ck3r@St0rM:/home/sources/c/general# ./hex2fdec -t 4000
fa0H
a55k1ck3r@St0rM:/home/sources/c/general# ./hex2fdec -d fa0H
4000
a55k1ck3r@St0rM:/home/sources/c/general# ./hex2fdec -d FA0H
4000
a55k1ck3r@St0rM:/home/sources/c/general# ./hex2fdec -v -d FA0H
Multiplaying 0 with 16 ^ 1
Multiplaying 17 with 16 ^ 2
Multiplaying 22 with 16 ^ 3
4000
a55k1ck3r@St0rM:/home/sources/c/general# ./hex2fdec -v -t 4000
Deviding 4000 / 256
Deviding 160 / 16
Deviding 0 / 1
fa0H
Logged

St0rM

  • [C programmer]
  • Administrator
  • Active Member
  • *****
  • Posts: 209
  • Why So serious ?
    • View Profile
    • WWW
    • Email
htoi

Code: [Select]
#include <stdio.h>                                              

enum hexchars{A=10,B,C,D,E,F};

long double htoi(const char string[])
{                                   
        long double             number = 0;
        int                     i = 0;     

        for(i=0 ; string[i] ; i++)
        {                         
                if(string[i] >= '0' && string[i] <= '9')
                        number = (16 * number) + (string[i] - '0');
                else                                               
                        switch(string[i])                         
                        {                                         
                                case 'a':                         
                                case 'A':                         
                                        number = (16 * number) + A;
                                        break;                     
                                case 'b':                         
                                case 'B':                         
                                        number = (16 * number) + B;
                                        break;                     
                                case 'c':                         
                                case 'C':                         
                                        number = (16 * number) + C;
                                        break;                     
                                case 'd':                         
                                case 'D':                         
                                        number = (16 * number) + D;
                                        break;
                                case 'e':
                                case 'E':
                                        number = (16 * number) + E;
                                        break;
                                case 'f':
                                case 'F':
                                        number = (16 * number) + F;
                                        break;
                                default:
                                        continue;
                        }
        }
        return number;
}

void usage(const char *argv)
{
        printf("usage %s hex string\n",argv);
}

int main(int argc , char **argv)
{
        if(argc < 2)
        {
                usage(argv[0]);
                return 0;
        }

        printf("%.0Lf\n",htoi(argv[1]));

        return 0;
Logged