我如何将具有以下形式的IP地址转换为整数:A.B.。或A.B.C.*或A.。.*或。.。 我想编写一个C程序,可以确定IP地址是否是另一个IP地址的子集。例如,IP地址192.168.125.5是192.168.。的子集。现在我想将两个IP地址都转换为唯一的整数,随后检查一个是否是另一个的子集。有办法实现这一点吗?
您想要确定一个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;
}
一个IP地址,例如192.168.0.1可以通过将其以十六进制写成整数,如0xC0 0xA8 0x00 0x01或0xC0A80001。
然后只需进行位匹配,因此您可以构建相应的子网掩码,即255.255.0.0,它只是0xFFFF0000,您可以通过执行以下操作测试两者是否匹配:
0xC0A80001 & 0xFFFF0000 == 0xC0A80000 & 0xFFFF0000
在等式测试中,一个方面是“您关心的基本内容”,另一个方面是具有给定掩码的实际地址。
通常可以通过将“*”设置为0并将实际数字设置为0xFF来构造适当的掩码,如果您想要更细粒度的掩码,则使用“*”很难表达。
简单而不普遍的方法是使用sscanf(带有int a,b,c,d):
sscanf(ip,"%d.%d.%d.%d",&a,&b,&c,&d);
但仅在您拥有所有部分的ip时才有效:10.47.100.1
如果不是这种情况,则仍然可以使用sscanf
的返回值,该值将告诉您成功找到多少匹配项(或EOF)。
在获得4个数字后,您可以检查子集关系。
inet_pton()
。 - Jasen