使用二分查找法,查找ip所在的范围对应的code(语言为java\scala\python) java语言来实现

本文介绍了一种使用二分查找法实现IP地址范围匹配的方法。通过将IP地址转换为长整型,利用二分查找快速定位到指定IP所属的范围,从而获取对应的区域ID。文章详细展示了Java程序的实现过程,包括IP地址转换工具类、IP范围数据实体类及查找类的编写。

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

  1. 使用二分法实现查找ip所在的范围,并返回对应的id

start_ip end_ip code

0.0.0.0 1.0.0.255 1000000000

1.0.1.0 1.0.3.255 1156350100

1.0.4.0 1.0.7.255 1036000000

1.0.8.0 1.0.15.255 1156440100

java程序实现

行数据实体类

package IpRange;

public class MyIp {

    private long startIP;
    private long endIP;
    private String code;

    //构造方法
    public MyIp(long startIP, long endIP, String code) {
        this.startIP = startIP;
        this.endIP = endIP;
        this.code = code;
    }
    //空构造方法
    public MyIp(){}
    //toString方法

    @Override
    public String toString() {
        return "MyIp{" +
                "startIP=" + startIP +
                ", endIP=" + endIP +
                ", code='" + code + '\'' +
                '}';
    }
    //get与set方法

    public long getStartIP() {
        return startIP;
    }

    public void setStartIP(long startIP) {
        this.startIP = startIP;
    }

    public long getEndIP() {
        return endIP;
    }

    public void setEndIP(long endIP) {
        this.endIP = endIP;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}

ip地址转换工具类

package IpRange;

public class IPUtils {
    /**
     * ip地址转成long型数字
     * 将IP地址转化成整数的方法如下:
     * 1、通过String的split方法按.分隔得到4个长度的数组
     * 2、通过左移位操作(<<)给每一段的数字加权,第一段的权为2的24次方,第二段的权为2的16次方,第三段的权为2的8次方,最后一段的权为1
     * @param strIp
     * @return
     */
    public static long ipToLong(String strIp) {
        String[]ip = strIp.split("\\.");
        return (Long.parseLong(ip[0]) << 24) +
                (Long.parseLong(ip[1]) << 16) + (Long.parseLong(ip[2]) << 8) + Long.parseLong(ip[3]);
    }

    /**
     * 将十进制整数形式转换成127.0.0.1形式的ip地址
     * 将整数形式的IP地址转化成字符串的方法如下:
     * 1、将整数值进行右移位操作(>>>),右移24位,右移时高位补0,得到的数字即为第一段IP。
     * 2、通过与操作符(&)将整数值的高8位设为0,再右移16位,得到的数字即为第二段IP。
     * 3、通过与操作符吧整数值的高16位设为0,再右移8位,得到的数字即为第三段IP。
     * 4、通过与操作符吧整数值的高24位设为0,得到的数字即为第四段IP。
     * @param longIp
     * @return
     */
    public static String longToIP(long longIp) {
        StringBuffer sb = new StringBuffer("");
        // 直接右移24位
        sb.append(String.valueOf((longIp >>> 24)));
        sb.append(".");
        // 将高8位置0,然后右移16位
        sb.append(String.valueOf((longIp & 0x00FFFFFF) >>> 16));
        sb.append(".");
        // 将高16位置0,然后右移8位
        sb.append(String.valueOf((longIp & 0x0000FFFF) >>> 8));
        sb.append(".");
        // 将高24位置0
        sb.append(String.valueOf((longIp & 0x000000FF)));
        return sb.toString();
    }

    public static void main(String[] args) {
        System.out.println(ipToLong("219.239.110.138"));
        System.out.println(longToIP(18537472));
    }
}

ip查找类的实现

package IpRange;

import java.io.*;
import java.util.LinkedList;

public class IpRange {

/**
*
*@author ***
*@date
*二分查找法
*/
    public static MyIp getIpCode(String ip){

        MyIp[] myIps=getmyip();
        if(myIps==null||myIps.length==0) return null;
        long iplong=IPUtils.ipToLong(ip);
        if(iplong<myIps[0].getStartIP()||iplong>myIps[myIps.length-1].getEndIP()) return null;
        int left=0;
        int right=myIps.length-1;
        int mid=(left+right)/2;
        while (left<=right){

            if(iplong<myIps[mid].getStartIP()) right=mid-1;

            if(iplong>myIps[mid].getStartIP()) left=mid+1;

            if(iplong>=myIps[mid].getStartIP()&&iplong<=myIps[mid].getEndIP()) return myIps[mid];

            mid=(left+right)/2;

        }
        return null;

    }
    /**
    *@author
    *@date
    *读取文件转换成MyIp对象
    */
    public static MyIp[] getmyip(){
        InputStreamReader inputStreamReader=null;
        BufferedReader bufferedReader=null;
        File file=new File("E:\\aaa\\iprule");
        try {
            inputStreamReader=new InputStreamReader(new FileInputStream(file),"UTF-8");

            bufferedReader=new BufferedReader(inputStreamReader);

            String line;

            LinkedList<MyIp> linkedList=new LinkedList<MyIp>();

            while ((line=bufferedReader.readLine())!=null){

                String[] ipranges=line.split(",");


                linkedList.add(new MyIp(IPUtils.ipToLong(ipranges[0]),IPUtils.ipToLong(ipranges[1]),ipranges[2]));
            }
            MyIp[] myIps=linkedList.toArray(new MyIp[]{});
            return myIps;

        } catch (IOException e) {
            e.printStackTrace();
        }
    return null;
    }

    public static void main(String[] args) {

        MyIp myIp=getIpCode("1.2.16.15");

        String code=myIp.getCode();
        System.out.println("你所在的城市为:"+code);


    }
}

 

Acunetix网络漏洞扫描软件检测您网络的安全性软件介绍: Acunetix开创web应用程序安全扫描技术: 早在1997年Acunetix工程师就已关注网络安全并成为网络站点分析和漏洞检测方面的编程领导者。多达70 %的网站有漏洞,可能导致公司机密数据被盗,如 信用卡信息和客户名单。 黑客正在每天24小时,每周七天的专注攻击Web的应用程序--购物车,表格,登入网页,动态页面等。世界上任何不安全Web应用层都为他们提供了方便的 后端企业数据库。 对于Web应用黑客,防火墙,ssl及锁定服务器等方法是徒劳的。针对Web应用程序的攻击,是通过80端口,他们可以穿过防火墙,操作系统和网络级的安全 防护设备,取得您的应用程序和企业的数据。量身定制的Web安全设备往往不够测试出一些还未发现的漏洞,因此容易成为黑客攻击目标。 Acunetix -在全世界范围内领先的网络应用安全设备 Acunetix开创了网络应用安全扫描技术:它的工程师们潜心研究网络安全。早在1997年制定了一项工程率先进行网站的弱点分析和检测。 Acunetix网络漏洞扫描器包含了许多创新的特点: 一种Java脚本自动分析仪支持Ajax安全测试和Web 2.0应用软件。 行业最先进和最深入的SQL注入和跨站点脚本测试 强大的可视化功能使得测试网页表单和密 码变很容易 广泛的报告设施,包括签证的PCI遵守情况报告 多线程快速扫描,抓取数以十万计的网页,十分方便 智能扫描器检测网络服务器类型和应用语言 Acunetix检索和分析网站的内容包括闪存,AJAX通过产品简介了解Acunetix Web Vulnerability Scanner的其他功能。 Acunetix Web Vulnerability Scanner 包含多种创新功能: 1) AcuSensor 技术。 2) 自动的客户端脚本分析器,允许对 Ajax 和 Web 2.0 应用程序进行安全性测试。 3) 业内最先进且深入的 SQL 注入和跨站脚本测试。 4) 高级渗透测试工具,例如 HTTP Editor 和 HTTP Fuzzer。 5) 可视化宏记录器帮助您轻松测试 web 表格和受密码保护的区域。 6) 支持含有 CAPTHCA 的页面,单个开始指令和 Two Factor(双因素)验证机制。 7) 丰富的报告功能,包括 VISA PCI 依从性报告。 8) 高速的多线程扫描器轻松检索成千上万个页面。 9) 智能爬行程序检测 web 服务器类型和应用程序语言。 10) Acunetix 检索并分析网站,包括 flash 内容、SOAP 和 AJAX 端口扫描 web 服务器并对在服务器上运行的网络服务执行安全检查。
### 开源 Web 漏洞扫描工具推荐 #### 1. OpenVAS (Greenbone Security Assistant) OpenVAS 是一款强大的开源漏洞扫描平台,提供广泛的漏洞检测能力。该工具拥有庞大的漏洞测试库,并能够执行深入的安全评估,适用于各种规模的企业环境[^2]。 ```bash sudo apt-get install openvas openvas-setup ``` #### 2. Nikto Nikto 是专门针对 Web 应用程序设计的一款开源安全扫描器,可以识别超过 6700 种潜在危险文件/程序,并检查配置错误和其他问题。其灵活性允许用户自定义插件来进行特定需求下的安全性审查[^3]。 ```bash git clone https://github.com/sullo/nikto.git cd nikto perl nikto.pl -h example.com ``` #### 3. Arachni Arachni 是一种智能化程度较高的 Web 应用审计框架兼扫描引擎。除了基本的 SQL 注入和跨站脚本攻击外,还特别擅长处理复杂的逻辑缺陷分析任务。它提供了图形界面版本 arachni-ui 来简化操作流程[^4]。 ```ruby gem install arachni arachni http://example.com/ ``` #### 4. Wapiti Wapiti 可以自动化地查找网页中存在的注入点以及其他常见类型的弱点。此软件采用 Python 编写而成,在安装部署方面相对简单便捷,适合初学者入门学习使用。 ```python pip install wapiti3 wapiti -u http://testphp.vulnweb.com/ ``` #### 5. XssPy XssPy 主要专注于反射型 XSS 和存储型 XSS 的挖掘工作。具备良好的扩展性和适应性,支持多线程并发请求发送机制提高效率;同时内置了丰富的 Payload 集合用于不同场景下尝试触发 JavaScript 执行环境。 ```bash docker pull xsspymaster/xsspy:latest docker run --rm -it xsspymaster/xsspy python3 xsspy.py -t http://targetwebsite.com ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值