Tsql T-Sql:检查IP是否与网络掩码匹配

Tsql T-Sql:检查IP是否与网络掩码匹配,tsql,ip-address,bit-manipulation,netmask,Tsql,Ip Address,Bit Manipulation,Netmask,我的SQL Server db将IP网络掩码存储为二进制文件。 我需要一种方法来匹配这些与给定的IP 比如说,, 192.168.21.5是存储在数据库中的网络掩码的一部分吗 192.168.21.5的二进制表示: 11000000.10101000.00010101.00000101 (without the dots) 数据库中存储的网络掩码为:二进制(4)和一个tinyint字段: 11000000.10101000.00010101.00000000 / 24 (即:192.168.

我的SQL Server db将IP网络掩码存储为二进制文件。 我需要一种方法来匹配这些与给定的IP

比如说,,
192.168.21.5
是存储在数据库中的网络掩码的一部分吗

192.168.21.5
的二进制表示:

11000000.10101000.00010101.00000101 (without the dots)
数据库中存储的网络掩码为:二进制(4)和一个tinyint字段:

11000000.10101000.00010101.00000000 / 24
(即:
192.168.21.0/24
)因此,
192.168.21.5
的前24位必须与数据库中的记录匹配

如何只检查二进制字段的第一个
n
位(类似于
左(text,24)


有没有什么聪明的方法可以做到这一点,可能是使用按位

192.168.21.5异或网络掩码(192.168.21.0)和255.255.255.0
(您只需要前24位)在“匹配”IP上都应该是
0

<

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

@netmask
必须介于2和32之间。

如果希望它与掩码0或1位一起工作,则需要将电源(2,32-@netmask)更改为 电源(强制转换(2为bigint),32-@netmask)
再见

这是否仅适用于位>=24(C类网络掩码)的情况?可以使它工作,但不是说位=16(B类),而是在较小的网络中使用位>24。我们检查了它,它似乎对任何位数的位都有效。B级口罩有什么问题?
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)
      )