【随手写写】重铸编程之魂笔记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
浙公网安备 33010602011771号