Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从子网和地址前缀长度生成子网掩码_C_Subnet - Fatal编程技术网

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))