工学1号馆

home

十六进制与点分十进制转换函数的实现

By Wu Yudong on November 27, 2016

最近在看CSAP的网络编程部分,练习题11.2 :编写程序hex2dd.c,将十六进制参数转换为点分十进制并打印结果

例如:输入:$./hex2dd 0x8002c2f2

输出:128.2.194.242

代码如下:

#include <stdio.h>

int ctoi(char ch)
{
    if(ch >= 'a') return (10 + ch -'a');
    return ch - '0';
}

void dex2dd(char *s)
{
    int n, flag = 0;
    char *p;
    p = s + 2;
    while(*p) {
        n = ctoi(*p) * 16 + ctoi(*++p) * 1;
        if(flag > 0) printf(".");
        printf("%d", n);
        p++; flag++;
    }
    printf("\n");
}

int main(int argc,char *argv[])
{
    dex2dd(argv[1]);
    return 0;
}

编译运行:

wu@ubuntu:~/linuxc$ gcc hex2dd.c -o hex2dd
wu@ubuntu:~/linuxc$ ./hex2dd 0x8002c2f2
128.2.194.242

练习题11.3 :与11.2刚好反过来 ,编写程序dd2hex.c,将它点分十进制参数转换为十六进制数并打印结果

例如:输入:$./dd2hex 128.2.194.242

输出:0x8002c2f2

代码如下:

#include <stdio.h>

char a[10];

int ctoi(char ch)
{
    if(ch >= 'a') return (10 + ch -'a');
    return ch - '0';
}

//将十进制的正整数n转换成base进制
void decimal(int n, int base)
{
    int r, i = 0;
    char c;
    if(n < 16) printf("0");
    do {
        r = n % base;
        c = r < 10 ? (r + '0') : ('a' + r - 10);
        a[i++] = c;
        n = n / base;
    } while (n);
    while (i) printf("%c", a[--i]); 
}

void dd2hex(char *s)
{
    char *p, *q;
    int i, n, count;
    n = 0;
    p = q = s;
    printf("0x");
    while(*q && *p) {
        while(*q != '.' && *q) q++;
        count = q - p;
        for(i = 0; i < count; i++) {        
            n = n * 10 + ctoi(*p);
            p++;
        }
        decimal(n, 16);
        if(*q) { 
            q++;
            p = q;
        }
        n = 0;
    }
    printf("\n");
}

int main(int argc,char *argv[])
{
    dd2hex(argv[1]);
    return 0;
}

编译运行:

wu@ubuntu:~/linuxc$ gcc dd2hex.c -o dd2hex
wu@ubuntu:~/linuxc$ ./dd2hex 128.2.194.242
0x8002c2f2

如果文章对您有帮助,欢迎点击下方按钮打赏作者

Comments

很不错,正好需要


学习了,之前在参加笔试的时候出现过类似的编程题目


To verify that you are human, please fill in "七"(required)