锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. JAVA
  4. ip地址转换成long型

ip地址转换成long型

0
  • JAVA
  • 发布于 2024-09-26
  • 0 次阅读
黄健
黄健

前段时间有以需求你,为了实现高效率的地址查找以及比对,将ip地址转化为long型存入redis进行处理,并按照ip进行AB(根据ip的奇偶)对照。

然后先梳理一下转换的逻辑和一些基础知识。

/**
     * 之前存储ip都是存字符串,没想过ip地址竟然还能存Long,于是测试了一下确实可以。
     * 举个简单例子先,比如有个ip地址是169.254.85.85,
     * 对应的二进制是10101001.11111110.1010101.1010101,将小数点去掉后变为101010011111111010101011010101,
     * 可以看到除了最低的位置的整数位置没有发生变化,其他三个位置的整数分别相对原来的位置左移了8位,16位,24位,而在二进制中每左移一位,就相当于*2,
     * 也就是说对应的每段数字分别乘2的8次方,16次方以及24次方,总体来说思路就是去掉ip地址的小数点后重新计算,
     * 上面这个ip地址转化为long型整数是2852017493,
     * 当然如果你觉得这样计算比较麻烦也可以通过将每段数字转化为十六进制后拼接,之后在计算器中直接转化为十进制效果是一样的,对应的十六进制是A9FE5555
     *
     * 
     * 基础运算知识:
     * 运算符解释:
     * (1)、"|"符号的含义就是将两个数字的二进制按右端对齐,只要有数字1就换1,当两个数字都是0才是0例如
     * 示例:202(二进制:11001010)| 163(10100011)可以像下面这样看 == 235(11101011)
     *      11001010
     *      10100011
     *      将有一的换成一,全是零的是零:11101011
     *
     * (2)、<< 这个位运算符号(左移运算),这两个都是位运算符号,实例如下:
     * 示例:202(11001010)<<2 == 808(1100101000) 表示202的二进制数字在右端添加两个零所表示的数字
     *
     * (3)、操作符为<<,向左移动,右边的低位补0,高位的就舍弃掉了,将二进制看做整数,左移1位就相当于乘以2。
     * (4)、无符号右移:操作符为>>>,向右移动,右边的舍弃掉,左边补0。
     * (5)、有符号右移:操作符为>>,向右移动,右边的舍弃掉,左边补什么取决于原来最高位是什么,原来是1就补1,原来是0就补0,将二进制看做整数,右移1位相当于除以2。
     * 
     */

1、ip地址转long型

private static Long ipToLong(String ipStr) {

        long ipLong = 0;

        if (ipStr != null && ipStr.length() > 0) {
            //将ip(点分十进制的形式 a.b.c.d) 地址按.分割
            String[] ipSplit = ipStr.split("\\.");
            try {
                if (ipSplit.length != 4) {
                    throw new Exception("IP Format Error");
                }
                for (int i = 0; i < ipSplit.length; i++) {
                    int temp = Integer.parseInt(ipSplit[i]);
                    ipLong += temp * (1L << (ipSplit.length - i - 1) * 8);
                }
            } catch (Exception e) {
                log.error("ip address to long type Error :{}", e);
            }
        } else {
            log.info("ip address is null or is ''");
        }
        return ipLong;

    }

2、long型ip转点分十进制格式

/**
     * 将long型IP地址转换回点分十进制表示的字符串类型
     * @param ipLong
     * @return java.lang.String
     * @throws Exception
     */
    private static String ipLongToString(long ipLong) {
        StringBuffer ipStr = new StringBuffer();
        try {
            if (ipLong < 0) {
                throw new Exception("Can not to IP...");
            }
            //最高8位,直接右移24位
            ipStr.append((ipLong >>> 24));
            ipStr.append(".");
            //将高8位设置0,然后右移16位
            ipStr.append(((ipLong & 0x00FFFFFF) >>> 16));//获得高8位,6个f对应的是24个1,最高8位设置空为0,之后右移16位将前面多余的16位去掉,以下类推即可
            ipStr.append(".");
            //将高16位设置0,然后右移8位
            ipStr.append((ipLong & 0x0000FFFF) >>> 8); //前16位 设置0,移除低8位,16个1,高16位设置为0
            ipStr.append(".");
            //将高24位设置0
            ipStr.append(ipLong & 0x000000FF); //前24位 设置0,留低8位,8个1,高24位设置为0
        } catch (Exception e) {
            log.error("Long type ip to point ten type error :{}", e);
        }
        return ipStr.toString();
    }

测试结果:

原文链接: https://onlyou.blog.csdn.net//article/details/107619097

标签: #JAVA 991
相关文章

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

SpringBoot整合异步任务执行 2024-10-08 11:24

同步任务: 同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用 户体验 异步任务: 异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源

springboot kafka多数据源,通过配置动态加载发送者和消费者 2024-10-08 11:24

前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需要对架构做一定的设计了。 准备test kafka本身非常容易上手,如果我们需要单元测试,引入ja

SpringBoot 集成 Redis 2024-10-08 11:24

一:SpringBoot 集成 Redis ①Redis是一个 NoSQL(not only)数据库, 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器;常用的数据类型: string , hash ,set ,zset , list ③通过Redis客户端可以使用多种语

SpringBoot整合QQ邮箱 2024-10-08 11:24

SpringBoot可以通过导入依赖的方式集成多种技术,这当然少不了我们常用的邮箱,现在本章演示SpringBoot整合QQ邮箱发送邮件…. 下面按步骤进行: 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域,如果当前账号未开启的话自己手动开启。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.