将IP地址转换为整数

时间:2012-04-23 15:38:21

标签: c networking

  

可能重复:
  IP Address to Integer - C

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

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:8)

IP地址,例如192.168.0.1可以通过十六进制写入一个整数,它变成0xC0 0xA8 0x00 0x01或者只是0xC0A80001

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

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

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

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