我有一个文件,它在一行中存储了一些子网信息:
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 中做这个。
你可以用 ~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
向左移动 32 位被视为根本没有移动。注意极端情况!
我是一名优秀的程序员,十分优秀!