收藏本站 
广告服务 
网站地图 
>> 本频道近100000余篇各类电脑技术、网络技术、软件技术、网页及平面设计等方面的电脑教程,我们的原则:不是精华拒不收录!
先飞电脑技术网技术文章软件教学Unix/Linux
网络编程 | 网站建设 | 网络技术 | 设计教程 | 软件教学 | 程序开发 | 数据库开发 | 教育认证 | 硬件维护 | 媒体动画 | 机械电子 |
二到十六进制之间的相互转换代码详细解析
[ 作者:佚名    转贴自:网络转载    阅读次数:91    更新时间:2007-8-15 11:25:00   录入:刘光勇 ]         
    此程序是用作二到十六进制的相互转换,用法如下:
  gcc advanceChange.c -o advanceChange
  ./advanceChange 1111 2 10
  意思是把二进制1111转换为十进制,结果是15

  源代码:

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

#define oops() {perror("malloc");exit(1);}

typedef struct ooput{
    int num;
    struct ooput *pre,*next;
}out;

//乘方运算,返回a的b次方的值

int power(int a,int b){
    int i;
    int x = a;
    if (b == 0)
        return 1;
    else if (b == 1)
        return a;
    else{
        for (i=1;i<b;i++){
            a = a * x;
        }
        return a;
    }
}

int translate(int time,char c[],int advance){
    int i,ten = 0;    
//变量ten是用来得到转换成十进制后的值

    int arg;    
//把字符转换成整型后赋给此变量


    for (i=0;i<time;i++){
        
//为字符时如何,为数字时如何

        if (isalpha(c[time-i-1])){
            
//按标准,进制中的字母应该是大写

            if (isupper(c[time-i-1]))
                arg = c[time-i-1] - 55;
            else{
                printf("请用大写字母\n");
                exit(1);
            }
        }
        else
            arg = c[time-i-1] - 48;
        if (arg > (advance-1)){
            printf("书写错误:%s 不是 %d进制\n",c,advance);
            exit(1);
        }
        
//得到转换成十进制的数值并将其赋给变量ten

        ten = ten + (arg * power(advance,i));
    }
    return ten;
}

//返回n进制转换后的十进制值

int first(char *parament1,char *parament2){
    int replay;

    
//得到n进制的长度,然后将其转换成char型数组,这样才能将其一个一个的进行转换

    int time = strlen(parament1);    
    char c[time];
    sprintf(c,"%s",parament1);

    
//根据对应的进制数,然后将其转换成十进制

    if (strcmp(parament2,"2") == 0)
        replay = translate(time,c,2);
    else if (strcmp(parament2,"3") == 0)
        replay = translate(time,c,3);
    else if (strcmp(parament2,"4") == 0)
        replay = translate(time,c,4);
    else if (strcmp(parament2,"5") == 0)
        replay = translate(time,c,5);
    else if (strcmp(parament2,"6") == 0)
        replay = translate(time,c,6);
    else if (strcmp(parament2,"7") == 0)
        replay = translate(time,c,7);
    else if (strcmp(parament2,"8") == 0)
        replay = translate(time,c,8);
    else if (strcmp(parament2,"9") == 0)
        replay = translate(time,c,9);
    else if (strcmp(parament2,"10") == 0)
        replay = translate(time,c,10);
    else if (strcmp(parament2,"11") == 0)
        replay = translate(time,c,11);
    else if (strcmp(parament2,"12") == 0)
        replay = translate(time,c,12);
    else if (strcmp(parament2,"13") == 0)
        replay = translate(time,c,13);
    else if (strcmp(parament2,"14") == 0)
        replay = translate(time,c,14);
    else if (strcmp(parament2,"15") == 0)
        replay = translate(time,c,15);
    else if (strcmp(parament2,"16") == 0)
        replay = translate(time,c,16);

    return replay;
}

//用一个双向链表储存转换后的值,最后返回链表的最后一个结点

out *output(int total,int advance){
    
//k在这个程序中并无实际意义,这的作用就是为了让程序区分中链表的第一个结点和其它的结点

    int k = 1;
    out *put,*pf;;

    while (total){
        if ((put=(out *)malloc(sizeof(out))) == NULL)
            oops();
        
//将取得的模赋给ooput结构中的num变量

        put->num = total % advance;
        
//将值赋给链表中第一个结点时如何,除第一个结点外其它的结点如何

        if (k == 1){
            put->next = NULL;
            put->pre = NULL;
            
//只所以把put赋给两个指针变量是为了能返回链表的第一个结点

            pf = put;
        }else{
            pf->next = put;
            put->pre = pf;
            put->next = NULL;
            pf = put;
        }
        total /= advance;
        k++;
    }

    return pf;
}

//将两个n进制相加后的值转换成对应的n进制

out *second(int total,char *parament){
    out *head;

    if (strcmp(parament,"2") == 0)
        head = output(total,2);
    else if (strcmp(parament,"3") == 0)
        head = output(total,3);
    else if (strcmp(parament,"4") == 0)
        head = output(total,4);
    else if (strcmp(parament,"5") == 0)
        head = output(total,5);
    else if (strcmp(parament,"6") == 0)
        head = output(total,6);
    else if (strcmp(parament,"7") == 0)
        head = output(total,7);
    else if (strcmp(parament,"8") == 0)
        head = output(total,8);
    else if (strcmp(parament,"9") == 0)
        head = output(total,9);
    else if (strcmp(parament,"10") == 0)
        head = output(total,10);
    else if (strcmp(parament,"11") == 0)
        head = output(total,11);
    else if (strcmp(parament,"12") == 0)
        head = output(total,12);
    else if (strcmp(parament,"13") == 0)
        head = output(total,13);
    else if (strcmp(parament,"14") == 0)
        head = output(total,14);
    else if (strcmp(parament,"15") == 0)
        head = output(total,15);
    else if (strcmp(parament,"16") == 0)
        head = output(total,16);

    return head;;
}

//得到链表的最后一个结点,从后向前输出链表内的值

void print(out *head){
    while (head != NULL){
        
//当数值在10-15之间时将其转换成字符并打印

        if (head->num > 9){
            printf("%c",head->num + 55);
        }else
            printf("%d",head->num);
        head = head->pre;
    }
    printf("\n");
}

int main(int argc,char *argv[]){
    int ten;
    out *head;

    if (argc != 4){
        printf("错误:参数太少或太多\n");
        exit(1);
    }
    ten = first(argv[1],argv[2]);
    head = second(ten,argv[3]);
    print(head);
    return 0;
}

文章首页【加入到收藏夹】告诉好友】【打印此文】【关闭窗口
  版权声明:本站提供的“二到十六进制之间的相互转换代码详细解析”版权归文章所有者,转载请注明出处!
 ·上一篇文章:Linux操作系统下C开发环境的构成与安装      ·下一篇文章:在Linux操作系统下FrameBuffer直接写屏
相关文章
·二到十六进制之间的相互转换代码详细解析[91]
网站主页 | 收藏本页 | 联系我们 | 广告服务 | 站点地图 | 会员注册 | 招聘信息 | 内容指正

联系QQ:先飞电脑技术网站事务联系QQ,点击可以直接留言. 32933427 电话:13710542091 [世界排名] 鄂ICP备05005890号 先飞电脑教程网