Oracle中IP位址和掩碼轉換成CIDR格式

2021-08-27 17:52:49 字數 1764 閱讀 2875

遇到的問題如下:資料庫中儲存了ip位址,以及ip位址掩碼,需要將他們轉化成cidr格式的,並且不僅僅是將掩碼轉化成cidr對應的數字的問題,需要將原有的ip位址轉化成對應的網路位址,例如ip位址是58.247.221.238,掩碼是255.255.255.252,需要將其轉化為58.247.221.236/30。

解決方案:我們知道,將ip位址和掩碼通過位與函式就能得到對應的網路位址.google一下,找到了將ipv4位址轉成數字以及轉化回來的函式。有了這兩個函式,再利用oracle 自帶的bitand函式,問題就解決了。可以先將ip位址和掩碼通過字串轉ip的函式轉成數字,然後通過位與運算就能得到相應的網路位址對應的數字,再通過數字轉字串的功能,即得到對應的網路位址。至於/後面cidr的數字,可以通過匯入一張掩碼和cidr數字的對應表得到,不在詳述.

實際例子如下: 返回58.247.221.236

sql**

select inttoip(bitand(dottedquadtonumber('58.247.221.238'),

ottedquadtonumber('255.255.255.252'))) from dual

附: 將字串轉成數字的函式:

sql**

create or replace function dottedquadtonumber ( dottedquad in varchar2) return number is

result number;

begin

result:= (substr(dottedquad ,

1, (instr(dottedquad , '.', 1, 1 ) - 1))

* 256 * 256 * 256

) +

(substr(dottedquad ,

instr(dottedquad , '.', 1, 1 ) + 1,

instr(dottedquad , '.', 1, 2 ) -

instr(dottedquad , '.', 1, 1 ) - 1) * 256 * 256

) +

(substr(dottedquad ,

instr(dottedquad , '.', 1, 2 ) + 1,

instr(dottedquad , '.', 1, 3 ) -

instr(dottedquad , '.', 1, 2 ) - 1) * 256

) +

(substr(dottedquad ,

instr(dottedquad , '.', 1, 3 ) + 1)

) ;

return(result );

end dottedquadtonumber ;

數字轉成ip位址的函式:

sql**

create or replace function inttoip(ip_address integer) return varchar2

deterministic

is begin

return to_char(mod(trunc(ip_address /256/ 256/256 ),256))

|| '.'|| to_char(mod(trunc(ip_address/ 256/256 ),256))

|| '.'|| to_char(mod(trunc(ip_address/ 256),256 ))

|| '.'|| to_char(mod(ip_address, 256));

end;

IP位址和掩碼

在專案中遇到了 10.0.0.0 8 的網路位址,只知道8是網路掩碼,但具體表示什麼位址,都還給老師了 趕緊翻書複習一下 子網掩碼是乙個長32位的值,讓ip分組的接收方能夠將ip位址的網路id部分與主機id部分區分開來。32位的子網掩碼由1和0組成,其中的1表示ip位址的相應部分為網路位址或子網位址...

Oracle中IP位址和掩碼轉換成CIDR格式

oracle中ip位址和掩碼轉換成cidr格式 遇到的問題如下 資料庫中儲存了ip位址,以及ip位址掩碼,需要將他們轉化成cidr格式的,並且不僅僅是將掩碼轉化成cidr對應的數字的問題,需要將原有的ip位址轉化成對應的網路位址,例如ip位址是58.247.221.238,掩碼是255.255.25...

IP位址和子網掩碼

基於ip協議的網際網路,目前已經發展成為當今世界上規模最大 擁有使用者最多 資源最廣泛的通訊網路。ip協議也因此成為事實上的業界標準,以ip協議為基礎的網路已經成為通訊網路的主流。但對很多網迷們來說ip位址還只是乙個概念,在次我們對ip位址及子網掩碼做乙個簡單闡述,以給大家乙個清晰的概念。一 為什麼...