C 从子网和地址前缀长度生成子网掩码
我有一个文件,它在一行中存储了一些子网信息,如下所示:C 从子网和地址前缀长度生成子网掩码,c,subnet,C,Subnet,我有一个文件,它在一行中存储了一些子网信息,如下所示: 123.123.0.0/16 123.123.123.123 第一部分是子网和地址前缀长度,然后是数据包应该到达的节点的ip地址 我试图确定给定的IP是否是子网的一部分,我了解这个过程在大部分情况下应该如何工作。但是我不知道如何从上面的信息生成子网掩码 我考虑过的选择是: 我在网上找到了许多地址前缀长度为1-32的表,所以我可以将其中一个表放到switch语句中,并称之为一天,但这似乎很糟糕 地址前缀长度为我提供了掩码中从左侧开始的“1
123.123.0.0/16 123.123.123.123
第一部分是子网和地址前缀长度,然后是数据包应该到达的节点的ip地址
我试图确定给定的IP是否是子网的一部分,我了解这个过程在大部分情况下应该如何工作。但是我不知道如何从上面的信息生成子网掩码
我考虑过的选择是:
我在网上找到了许多地址前缀长度为1-32的表,所以我可以将其中一个表放到switch语句中,并称之为一天,但这似乎很糟糕
地址前缀长度为我提供了掩码中从左侧开始的“1”的编号。因此,32地址前缀长度给出了右侧的“0”数。我可以将2的幂从2^address前缀长度添加到2^32,并将结果用作子网掩码。不过我有点担心这个想法,我有一种感觉,如果我尝试这样做的话,一个常规的int会溢出,所以我应该使用uint32\t,也许?我不确定
选择2行吗?我应该选择选项1吗?有更好的办法吗
我在C中这样做。这将适用于
前缀
在1到32范围内:0xFFFFFFFFU&-(1U您可以使用~0
形成所有掩码。您需要将其左移32-n
位,使n
低位为空:
#include <stdint.h>
uint32_t subnet_mask(int prefix_len)
{
return prefix_len ? ~0 << (32 - prefix_len) : 0;
}
/* Unit tests */
int main()
{
return 0xFFFFFF00u != subnet_mask(24)
+ 0x00000000u != subnet_mask(0)
+ 0xFFFFFFFFu != subnet_mask(32);
}
#包括
uint32子网掩码(整数前缀)
{
返回前缀_len?~0以下(未测试)宏应适用于值0到31。它生成一个掩码,可与IPv4地址进行AND运算,以生成地址的子网部分。n是IPv4地址子网部分的位数
#define SUBNET_MASK(n) ((1u << (n)) - 1)
#define NETWORK_MASK(n) (~SUBNET_MASK(n))