3

私の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したがって、の最初の24ビットは192.168.21.5データベース内のレコードと一致する必要があります。

nバイナリフィールドの最初のビットのみをチェックするにはどうすればよいですか(と同様LEFT(text, 24))?

これを行うための賢い方法はありますか?おそらくビット単位でANDですか?

4

4 に答える 4

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)
      )

@netmask2から32の間でなければなりません。

于 2009-12-30T23:28:25.110 に答える
1

192.168.21.5 XOR netmask (192.168.21.0) AND 255.255.255.0(最初の24ビットのみが必要です)すべて0が「一致する」IP上にある必要があります。

于 2009-12-30T15:08:53.507 に答える
0

この条件はそれを行います:

(0xffffffff - POWER(2, 32 - bits) + 1) & CAST(ip AS int) = CAST(netmask AS int)
于 2009-12-30T15:12:48.460 に答える
0

マスク0または1ビットで動作させたい場合は、power(2、32-@netmask)をpower(cast(2 as bigint)、32-@netmask)に変更する必要があります。

于 2018-03-28T11:26:36.807 に答える