gpt4 book ai didi

c - 从子网和地址前缀长度生成子网掩码

转载 作者:太空宇宙 更新时间:2023-11-04 08:19:16 25 4
gpt4 key购买 nike

我有一个文件,它在一行中存储了一些子网信息:

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 位被视为根本没有移动。注意极端情况!

关于c - 从子网和地址前缀长度生成子网掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34072299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com