oracle中ip地址转换,java和Oracle中ip地址与数值的相互转换

这篇博客介绍了如何在Oracle数据库中将数值型的IP地址转换为字符串形式,以及在Java中进行类似的转换操作。提供了创建Oracle函数ip2number和number2ip的示例,用于IP地址和数值之间的相互转换,并给出了Java方法ip2long和long2ip的实现,便于在编程中处理IP地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中有个地方要用到导入某个安全系统的数据库进行分析,需要用到里面记录的ip地址,倒过来之后发现ip地址是数值型的,比如190131313 这样开始还以为是没有加“.”呢 一番研究弯路之后才知道原来ip是经过处理了,果然是安全系统,oh shit

百google度之后看到两篇文章值得借鉴 分别是

oracle中的转换

create or replace function ip2number(ip varchar2)

return number

is

ip_num_hex varchar2(80);

begin

if (regexp_like(ip, '^(/d{1,3})/.(/d{1,3})/.(/d{1,3})/.(/d{1,3})$')) then

ip_num_hex := lpad(trim(to_char(regexp_replace(ip, '^(/d{1,3})/.(/d{1,3})/.(/d{1,3})/.(/d{1,3})$', '/1'), 'XX')),2,'0') ||

lpad(trim(to_char(regexp_replace(ip, '^(/d{1,3})/.(/d{1,3})/.(/d{1,3})/.(/d{1,3})$', '/2'), 'XX')),2,'0') ||

lpad(trim(to_char(regexp_replace(ip, '^(/d{1,3})/.(/d{1,3})/.(/d{1,3})/.(/d{1,3})$', '/3'), 'XX')),2,'0') ||

lpad(trim(to_char(regexp_replace(ip, '^(/d{1,3})/.(/d{1,3})/.(/d{1,3})/.(/d{1,3})$', '/4'), 'XX')),2,'0');

return to_number(ip_num_hex, 'XXXXXXXX');

else

return -1;

end if;

exception

when others then

return -99999999999;

end;

select ip2number('169.254.55.6') from dual;

IP2NUMBER('169.254.55.6')

-------------------------

2852009734

create or replace function number2ip(num number)

return varchar2 is

ip_num_hex varchar2(8);

begin

ip_num_hex := lpad(trim(to_char(num, 'XXXXXXXX')), 8, '0');

return to_number(substr(ip_num_hex, 1, 2), 'XX') || '.' ||

to_number(substr(ip_num_hex, 3, 2), 'XX') || '.' ||

to_number(substr(ip_num_hex, 5, 2), 'XX') || '.' ||

to_number(substr(ip_num_hex, 7, 2), 'XX');

exception

when others then

dbms_output.put_line(sqlerrm);

return null;

end;

select number2ip(2852009734) from dual;

NUMBER2IP(2852009734)

--------------------------------------------------------------------------------

169.254.55.6

java中实现方式

/**

* ip地址转成整数.

* @param ip

* @return

*/

public static long ip2long(String ip) {

String[] ips = ip.split("[.]");

long num = 16777216L*Long.parseLong(ips[0]) + 65536L*Long.parseLong(ips[1]) + 256*Long.parseLong(ips[2]) + Long.parseLong(ips[3]);

return num;

}

/**

* 整数转成ip地址.

* @param ipLong

* @return

*/

public static String long2ip(long ipLong) {

//long ipLong = 1037591503;

long mask[] = {0x000000FF,0x0000FF00,0x00FF0000,0xFF000000};

long num = 0;

StringBuffer ipInfo = new StringBuffer();

for(int i=0;i<4;i++){

num = (ipLong & mask[i])>>(i*8);

if(i>0) ipInfo.insert(0,".");

ipInfo.insert(0,Long.toString(num,10));

}

return ipInfo.toString();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值