ip地址转换

需求:将一个无符号整型的数按8位进行一划分,转换为(192.168.1.1)这种IP地址形式。

方法一:常规方法

图解原理:转换为2进制,从右向左8位一划分,不足的部分用0填充。

ip地址转换_第1张图片

函数设计:图示

ip地址转换_第2张图片

核心:用四个变量分别记录没每8位二进制对应的十进制数

代码实现:

#include 
#include     //strlen函数
#include     //itoa函数
#include       //pow函数
void ipdress(unsigned int ip,char buff[])
{
    char arr[35];
    itoa(ip,arr,2);
    int len = strlen(arr)-1;
    int a=0,b=0,c=0,d=0;
    for(int i=0,j=0;j<32;i++,j++,len--)
    {
        if(i==8) i=0;  //次方控制变量
        if(len>=0 && arr[len] != '0'){
        if(j<8) d+=pow(2,i);
        else if(j>=8 && j<16) c+=pow(2,i);
        else if(j>=16 && j<24)b+=pow(2,i);
        else if(j>=24 && j<32) a+=pow(2,i);
        }
    }
    sprintf_s(buff,16,"%d.%d.%d.%d\0",a,b,c,d);//格式转换
}
int main()
{
    unsigned int ip=123456789;
    char buff[16];
    //scanf("%u",&ip);
    ipdress(ip,buff);
    printf("%s\n",buff);
    return 0;
} 

该代码的时间复杂度为: O(n)

用例 测试:

ip地址转换_第3张图片

方法二:利用联合体结构(共享内存),结构体结构嵌套(字节对齐),将四个字节分为4份

ip地址每个字段为0~255,故使用无符号字符类型。

注意windows为小端存储模式。证明在此lian'jielianjie文末http://t.csdn.cn/gthdm

#include 

union ip
{
    unsigned int a;
    struct {
        unsigned char s1;
        unsigned char s2;
        unsigned char s3;
        unsigned char s4;
    };
};
void Toip(unsigned int a, char* buff)
{
    ip b ;
    b.a = a;
    int ch=b.s1;
    sprintf_s(buff, 16, "%d.%d.%d.%d\0", b.s4, b.s3, b.s2, b.s1);//格式转换
    //widows平台为小端模式,低地址存放低位数据
}
int main()
{
    unsigned int ip = 123456789;
    char buff[16];
    //scanf("%u",&ip);
    Toip(ip, buff);
    printf("%s", buff);
    return 0;
}

你可能感兴趣的:(C语言,c语言)