【随手写写】重铸编程之魂笔记02

IPV4地址转换

graph LR; A[192.168.10.100] --> B[0xc0a80a64]

思路在代码注释中
C语言实现:

#include<stdio.h>
//用于判断是否OK的标志
#define CVT_ERROR 1
#define CVT_OK 0

//ipv4地址转换
//192.168.0.1
//正好用int存储,x.x.x.x,x的范围是0-255
int get_ipv4(int* ip,char* ipstr){
    if(ipstr == NULL){
        return CVT_ERROR;
    }
    int value = 0;
    unsigned char offset = 24; //记录向左移动多少位
    int v = 0;
    //按.分割字符串,strtok的返回值指向第一个子字符串的指针
    char* str = (char *)strtok(ipstr, ".");
    while(str != NULL){
        //将当前子串的数字转成int类型(10进制)
        v = (int)strtol(str, NULL, 10);
        //比如ipv4地址的192.xxx...的192是第一个子串
        //当前子串和保存最终ipv4地址的变量做或运算
        //用或操作保证不把原来的值抹除
        //第一次Value都是0000 0000...
        //然后我们把192(10进制)放进去后,是从右往左存的,是在最低位的
        //但是192在最高位,所以还要向左移动24位(3个字节),即移动到最高位
        //后面的地址依次比之前少移动8位直到不用移动
        //第二次再传入值,由于是做或操作,之前的192(10进制)中的二进制的1和0做或操作依然能够保留
        value |= v << offset;
        offset -= 8;
        //每次调用 strtok 函数,我们将分割后的子字符串打印出来,并将其传入的第一个参数设置为 NULL,以获取后续的子字符串
        str = strtok(NULL, ".");
    }
    *ip = value;
    return CVT_OK;
}

//将int类型存储的ip地址打印出来
void print_ipv4(int ipvalue){
    printf("ipv4地址为:%u.%u.%u.%u",
    ((ipvalue & 0xFF000000) >> 24),
    ((ipvalue & 0x00FF0000) >> 16),
    ((ipvalue & 0x0000FF00) >> 8),
    ((ipvalue & 0x000000FF)));
}

int main(){
    char ipstr[] = "192.168.10.100"; //测试用的ip地址
    int ipvalue = 0;
    get_ipv4(&ipvalue, ipstr);
    printf("%#x\n", ipvalue); //以16进制输出
    print_ipv4(ipvalue);
    return 0;
}

输出结果:
0xc0a80a64
ipv4地址为:192.168.10.100

posted @ 2025-04-22 20:50  秦瑞迁  阅读(309)  评论(0)    收藏  举报