est ici une approche plus mathématique, ce qui évite les chaînes à tout prix:
def cidr_mask
Integer(32-Math.log2((IPAddr.new(mask,Socket::AF_INET).to_i^0xffffffff)+1))
end
avec « masque » étant une chaîne comme 255.255.255.0. Vous pouvez le modifier et remplacer le premier argument par "mask" si "mask" est déjà une représentation entière d'une adresse IP.
Ainsi, par exemple, si le masque était "255.255.255.0", IPAddr.new (masque, Socket de AF_INET) .to_i deviendrait 0xffffff00, qui est ensuite XOR avec 0xffffffff, qui est égal à 255.
Nous ajoutons 1 à cela pour faire une gamme complète de 256 hôtes, puis trouvons la base de log 2 de 256, qui est égale à 8 (les bits utilisés pour l'adresse hôte), puis soustraire 8 de 32, ce qui équivaut à 24 bits utilisés pour l'adresse réseau).
Nous avons ensuite converti en entier parce que Math.log2 renvoie un flottant.
Une solution est probablement d'utiliser la gemme ipadmin au lieu qui ressemble beaucoup plus complet. Je suis toujours intéressé de voir quelle est la solution du point de vue du code. –