将IP地址转换为整数

mmu*_*tam 7 c networking

可能重复:
整数的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)

  • @Zac多么尴尬!我已修复错误. (2认同)

Fle*_*exo 8

通过以十六进制写入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的东西来构造一个合适的掩码,如果你想要更精细的粒子掩码,很难用'*'来表达.