我的SQL-Server数据库将IP网络掩码存储为二进制文件。 我需要一种方法来匹配这些与给定的IP
例如,
是192.168.21.5
网络掩码的一部分,它存储在DB?
192.168.21.5
的二进制表示形式:
11000000.10101000.00010101.00000101 (without the dots)
存储在DB中的网络掩码是:binary(4)和tinyint字段:
11000000.10101000.00010101.00000000 / 24
(这将是:192.168.21.0 /24
)所以,192.168.21.5
的前24位必须匹配数据库中的记录。
我如何只检查二进制字段的第一个n
位(类似于LEFT(text, 24)
)?
有没有聪明的方法可以做到这一点,可能是按位AND
?
答案 0 :(得分: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
必须介于2到32之间。
答案 1 :(得分:1)
192.168.21.5 XOR netmask (192.168.21.0) AND 255.255.255.0
(您只需要前24位)应该是“匹配”IP上的所有0
。
答案 2 :(得分:0)
这个条件是这样的:
(0xffffffff - POWER(2, 32 - bits) + 1) & CAST(ip AS int) = CAST(netmask AS int)
答案 3 :(得分:0)
如果你想使用掩码0或1位,那么你需要更改电源(2,32 - @netmask) power(cast(2 as bigint),32 - @netmask) 再见