可能重复:
整数的IP地址 - C.
如何将IP地址转换为具有以下形式的整数:AB .或ABC*或A. ..*或... 我想写一个C程序,它可以确定IP地址是否是另一个的子集.例如,IP地址192.168.125.5是192.168的子集...现在我想将IP地址转换为唯一的整数,然后检查一个是否是另一个的子集.有没有办法实现这个目标?
Omn*_*ity 13
您想要的是确定IP地址是否在子网中,并且要执行此操作您要应用网络掩码.可能(肯定)库已经在那里做你想做的事.这是你想要自己推出的.
如果此IP地址来自可信来源(即非用户),那么您可以通过执行以下操作从标准C字符串中提取IP地址:
char ipAddressString[16] = "192.168.125.5"
char netMaskString[16] = "255.255.0.0"
char subnetString[16] = "192.168.0.0"
uint32_t ipAddress = parseIPV4string(ipAddressString);
uint32_t netmask = parseIPV4string(netmaskString);
uint32_t subnet = parseIPV4string(subnetString);
if (ipAddress & netmask == subnet) {
return true;
}
uint32_t parseIPV4string(char* ipAddress) {
char ipbytes[4];
sscanf(ipAddress, "%uhh.%uhh.%uhh.%uhh", &ipbytes[3], &ipbytes[2], &ipbytes[1], &ipbytes[0]);
return ipbytes[0] | ipbytes[1] << 8 | ipbytes[2] << 16 | ipbytes[3] << 24;
}
Run Code Online (Sandbox Code Playgroud)
通过以十六进制写入IP地址(例如192.168.0.1)可以很容易地写为整数,该十六进制变为0xC0 0xA8 0x00 0x01或仅为0xC0A80001
然后它只是一个位匹配的情况,所以你构造一个相应的子网掩码,255.255.0.0只是0xFFFF0000你可以测试两者匹配:
0xC0A80001 & 0xFFFF0000 == 0xC0A80000 & 0xFFFF0000
Run Code Online (Sandbox Code Playgroud)
等式测试的一方是"你关心的基础东西"而另一方是真正的地址,两侧的给定掩码是相同的.
一般来说,你可以通过设置'*'为0的东西和实际数字为0xFF的东西来构造一个合适的掩码,如果你想要更精细的粒子掩码,很难用'*'来表达.