遇到的問題如下:資料庫中儲存了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位址及子網掩碼做乙個簡單闡述,以給大家乙個清晰的概念。一 為什麼...