将IP地址转换为整数

可能重复:
整数的IP地址 – C.

如何将IP地址转换为具有以下forms的整数:AB 或ABC *或A. 。*或 我想编写一个C程序,可以确定IP地址是否是另一个的子集。 例如,IP地址192.168.125.5是192.168的子集。 。 现在我想将IP地址转换为唯一的整数,然后检查一个是否是另一个的子集。 有没有办法实现这个目标?

通过将其写成hex(即0xC0 0xA8 0x00 0x01或仅为0xC0A80001),可以轻松地将IP地址(例如192.168.0.1)写为整数

然后它只是一个位匹配的情况,所以你构造一个相应的子网掩码,255.255.0.0只是0xFFFF0000你可以通过这样做测试两者匹配:

 0xC0A80001 & 0xFFFF0000 == 0xC0A80000 & 0xFFFF0000 

等式测试的一方是“你关心的基础东西”而另一方是真正的地址,两侧的给定掩码是相同的。

一般来说,你可以通过设置’*’为0的东西和实际数字为0xFF的东西来构造一个合适的掩码,如果你想要更精细的粒子掩码,很难用’*’来表达。

您想要的是确定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; } 

简单而非一般的方法是使用sscanf(使用int a,b,c,d): sscanf(ip, "%d.%d.%d.%d", &a, &b, &c, &d); 但它只有在你拥有所有部分的ip时才有效:10.47.100.1

如果不是这种情况,你仍然可以使用sscanf的返回值,它将告诉你它成功找到多少匹配(或EOF)。

在获得4个数字之后,您可以检查子集关系。

单个整数(假设为32位)不足以表示您所概述的内容。 您需要更多信息才能表达星号。

例如,你可以有一对(地址,网络掩码),其中网络掩码或者是一个表示有效高阶位数的小整数,因此例如网络地址如“10.0.0.0”可能是由对(0x0a000000,8)表示。 如果你真的希望由于某种原因能够在地址中的“任何地方”使用通配符,则每个地址位需要一整套标志位,因此需要两个32位整数。 然后你可以代表“192.168 ……”这样的对(0xc0a80000,0xffff0000)。