2009-12-30 7 views
2

Ma base de données SQL-Server stocke les masques de réseau IP en tant que binaires. Je besoin d'un moyen de les faire correspondre avec une adresse IPT-SQL: vérifiez si IP correspond au masque de réseau

donné Par exemple, est 192.168.21.5 partie d'un masque de réseau qui est stocké dans la base de données?

La représentation binaire de 192.168.21.5:

11000000.10101000.00010101.00000101 (without the dots) 

Le masque de réseau stockées dans la DB est la suivante: binaire (4) et un champ tinyint:

11000000.10101000.00010101.00000000/24 

(qui serait: 192.168.21.0 /24) de telle sorte, les 24 premiers bits de 192.168.21.5 doivent correspondre à un enregistrement dans la base de données.

Comment est-ce que je vérifierais seulement le premier n bits d'un champ binaire (semblable à LEFT(text, 24))?

Y at-il une façon intelligente de le faire, peut-être avec bitwise AND?

Répondre

7
declare @address binary(4) -- goal is to check if this address 
declare @network binary(4) -- is in this network 
declare @netmask tinyint -- with this netmask in /NN format 

set @address = 0xC0A81505 -- 192.168.21.5 
set @network = 0xC0A81500 -- 192.168.21.0 
set @netmask = 24 

select 
    'address matches network/netmask' 
where 
    0 = (
     cast(@address as int)^cast(@network as int)) 
     & 
     ~(power(2, 32 - @netmask) - 1) 
    ) 

@netmask doit être compris entre 2 et 32.

1

192.168.21.5 XOR netmask (192.168.21.0) AND 255.255.255.0 (vous voulez seulement les premiers 24 bits) devrait être tous 0 sur le "correspondant" IP.

0

Cette condition le fait:

(0xffffffff - POWER(2, 32 - bits) + 1) & CAST(ip AS int) = CAST(netmask AS int) 
+0

est cela signifie que de travailler avec des bits> = 24 (classe C) Netmask? pourrait le faire fonctionner, mais pas avec say bits = 16 (classe B) , mais fonctionne avec des bits> 24 pour les petits réseaux – reinhard

+0

Je viens de le vérifier, et il semble fonctionner pour moi pour un certain nombre de bits. Quels problèmes obtenez-vous pour les masques de classe B? –

Questions connexes