gpt4 book ai didi

ruby - ruby中两个网络掩码的总和

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

亚马逊现在拥有 3.0.0.0/8显然是分两 block 购买的:3.0.0.0/93.128.0.0/9

我如何在 Ruby 中编写程序来添加 3.0.0.0/93.128.0.0/9 并获得结果 - 3.0.0.0/8?

我可以通过这种方式将掩码转换为 cidr:

"255.255.255.0"  \
.split(".") \
.map { |e| e.to_i.to_s(2).rjust(8, "0") } \
.join \
.count("1") # => 24

但是我怎样才能将一个面具添加到另一个面具呢?

这是我现在拥有的:

[1] pry(main)> "3.128.0.0".split('.').map { |e| e.to_i.to_s(2).rjust(8, "0") }
=> ["00000011", "10000000", "00000000", "00000000"]
[2] pry(main)> "3.0.0.0".split('.').map { |e| e.to_i.to_s(2).rjust(8, "0") }
=> ["00000011", "00000000", "00000000", "00000000"]

如何将 /9 应用于上述两个地址?

最佳答案

我不知道我是否正确理解了这一点,但也许这会有所帮助。

定义一些方法来进行计算:

def ip_to_bin(ip)
ip.split('.').map { |e| e.to_i.to_s(2).rjust(8, "0").split('').map(&:to_i) }
end

def network(ip, mask)
# convert string to array of bin
ip = ip_to_bin(ip)
mask = ip_to_bin(mask)
# then bitwise sums
ip.zip(mask).map { |e| e.first.zip(e.last).map { |s, a| s & a } }.map { |e| e.reverse.map.with_index { |d,i| d.to_i * 2**i }.sum }.join('.')
end

def cidr_to_mask(cidr)
(cidr.times.map{ 1 } + (32 - cidr).times.map{ 0 }).each_slice(8).map { |e| e.reverse.map.with_index { |d,i| d.to_i * 2**i }.sum }.join('.')
end

然后使用以下方法计算您的网络:

cidr = 8
ip = "3.0.0.0"
mask = cidr_to_mask(cidr) #=> "255.0.0.0"
network(ip, mask) #=> "3.0.0.0"

另一个例子:

network("176.232.53.237", cidr_to_mask(26)) #=> "176.232.53.192"

计算来自 CIDR 的主机数:

def nr_hosts_from(cidr)
((32-cidr).times.map{ 1 }).reverse.map.with_index { |d,i| d.to_i * 2**i }.sum - 1
end

nr_hosts_from(8) #=> 16777214
nr_hosts_from(9) #=> 8388606

关于ruby - ruby中两个网络掩码的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53218584/

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