使用Swift爆炸IPv4范围。 💥

最近,在使用SwiftNIO进行宠物项目时,我发现需要将定义为范围的IPv4集扩展到IP地址数组中。

我上过Google,但是可惜,我在Swift中找不到任何预先存在的模块或代码示例。 我还简要阅读了Apple的新Network.framework,其中引入了新的IPAddress Type和其他一些简洁的东西……但是它不包括对我所寻找的功能的支持。 😔

在过去的类似项目中,我已经多次使用ipaddress等python库。 就像一个好的图书馆一样,它们总是抽象化事物的工作原理,并为您提供一种或两种简单的方法来完成大多数任务。

我自己做一个简化版本有多难? 事实证明,一次尝试以错误的方式做几次就不会太难。

IP范围

经过几次失败的尝试,尝试使用花式迭代和不同八位位组级别的嵌套后,它突然浮现了……

“ IP地址实际上只是用易于沟通的包装表达出来的大数字”🧐

这是真的。 IPv4地址只是1到4,294,967,296(IPv4地址空间)之间的整数,表示为由句点分隔的4个8位数字(八位字节)。

知道这一点,问题就变得简单得多。 要将IP范围扩展到其组成地址列表中,您只需执行几个简单的步骤。

  1. 将上限和下限转换为整数。
  2. 构建一个数组,其中包含上限和下限之间的所有整数。
  3. 遍历数组,将整数转换回IPv4格式。

我编写了几个函数,使用几种不同的方法来完成这些步骤。

IP到整数

从IPv4转换为整数并不复杂。 我研究了几种方法。

第一种方法较为详细,但对于某些人可能更容易理解。 它的工作原理是遍历IP地址中的八位位组,然后将每个八位位组乘以下一个256的幂。这是有效的,因为IP地址的基数为256。

使用base256的IP到Int

另外,您也可以在Swift中使用位移运算符来完成此操作。 如您所见,我们的通用函数看起来非常相似,但是,我们只是在移位位,而不是进行算术运算。

使用移位将IP转换为Int

整数到IP

我认为这是棘手的部分。 同样,我们可以通过从较早的时候反转256操作的幂或使用位移来做到这一点。 但是,与从IP到Int不同,在这种情况下,按位运算显然不那么复杂。

这里使用256的幂的基本思想是在每次迭代期间(从最高有效到最低有效)使用循环提取原始IP的一个八位位组。 这有点混乱,因为第一个八位位组和最后一个八位位组与中间两个八位位组的处理方式必须有所不同。

幸运的是,按位执行此功能非常容易。 在这里,我们只是进行移位操作和按位与,以确定每个八位位组值。

放在一起

这确实是很容易的部分,并且不管上面使用的方法如何组合都应该起作用。


使用Swift即可进行简单的IPv4范围扩展。 如果您知道执行此操作的任何更优雅或有效的方法,请在评论中分享。