IP地址和int互转

/**
 * @author: yqq
 * @date: 2019/5/8
 * @description: ip地址与int之间互换
 * https://mp.weixin.qq.com/s?__biz=MzIzMzgxOTQ5NA==&mid=2247486894&idx=1&sn=bf17d404a989c3bb202241326d94647b&chksm=e8fe91a7df8918b1708f0cb759c6f9411d43ac22c257d56cc9191f74dc5eadd666862bb4bd92&scene=0&xtrack=1#rd
 */
public class IPToString {
    /**
     &:全是1则为1,否则为 0
     |:只要一个为1则为1,否则为0

     十进制转成十六进制:
     Integer.toHexString(int i)
     十进制转成八进制
     Integer.toOctalString(int i)
     十进制转成二进制
     Integer.toBinaryString(int i)
     十六进制转成十进制
     Integer.valueOf("FFFF",16).toString()
     八进制转成十进制
     Integer.valueOf("876",8).toString()
     二进制转十进制
     Integer.valueOf("0101",2).toString()
     */

    public static void main(String[] args) {
        String[] ips4Test = new String[]{"0.0.0.0", "127.0.0.1",
                "192.168.1.1", "255.0.0.255", "255.255.255.255"};
        for (String ip : ips4Test) {
            test(ip);
        }
    }

    public static void test(String ip) {
        int ipInt = ip2Int(ip);
        String ipString = int2Ip(ipInt);
        System.out.println("用于测试的ip地址: " + ip + ", int表示: " + ipInt + ", 二进制: " + Long.toBinaryString(ipInt)
                + ", 转回String: " + ipString + ",与测试 ip 地址是否相等: " + ip.equals(ipString));
    }

    /**
     * 将 ip 字符串转换为 int 类型的数字
     * <p>
     * 思路就是将 ip 的每一段数字转为 8 位二进制数,并将它们放在结果的适当位置上
     *
     * @param ipString ip字符串,如 127.0.0.1
     * @return ip字符串对应的 int 值
     */
    public static int ip2Int(String ipString) {
        // 取 ip 的各段
        String[] ipSlices = ipString.split("\\.");
        int rs = 0;
        for (int i = 0; i < ipSlices.length; i++) {
            // 将 ip 的每一段解析为 int,并根据位置左移 8 位
            int intSlice = Integer.parseInt(ipSlices[i]) << 8 * i;
            // 求与
            rs = rs | intSlice;
        }
        return rs;
    }

    /**
     * 将 int 转换为 ip 字符串
     *
     * @param ipInt 用 int 表示的 ip 值
     * @return ip字符串,如 127.0.0.1
     */
    public static String int2Ip(int ipInt) {
        String[] ipString = new String[4];
        for (int i = 0; i < 4; i++) {
            // 每 8 位为一段,这里取当前要处理的最高位的位置
            int pos = i * 8;
            // 取当前处理的 ip 段的值
            int and = ipInt & (255 << pos);
            // 将当前 ip 段转换为 0 ~ 255 的数字,注意这里必须使用无符号右移
            ipString[i] = String.valueOf(and >>> pos);
        }
        return String.join(".", ipString);
    }
}

原文地址:https://www.cnblogs.com/heqiyoujing/p/11148313.html

时间: 2024-11-10 07:37:49

IP地址和int互转的相关文章

IP地址的存储和使用

ip地址使用int类型存储,用INET_NTOA()和INET_ATON()转换 mysql> select inet_ntoa('2130706433'),inet_aton('127.0.0.1'); +-------------------------+------------------------+ | inet_ntoa('2130706433') | inet_aton('127.0.0.1') | +-------------------------+--------------

C#根据IP地址和子网掩码计算广播地址

using System.Net; /// <summary> /// 获得广播地址 /// </summary> /// <param name="ipAddress">IP地址</param> /// <param name="subnetMask">子网掩码</param> /// <returns>广播地址</returns> public static stri

IP地址在数据库里面的存储方式

大多数公司的表结构都需要经过DBA进行审核,有时候你会看到存储IP地址采用varchar(15),这种方式都是传统的做法,这种方法需要占用15个字节,那么有更省空间的做法么?肯定是有的,那就是用int存储.如果采用int存储这里又有2种处理方式. 1. 利用MySQL函数进行处理.可以采用INET_ATON,INET_NTOA函数进行转换. 2. 利用开发语言的函数进行处理,以php进行举例.可以采用ip2long,long2ip函数进行转换. 上面2种方法得到的结果都是一致的.因为算法都是一样

针对ip地址排序的解决办法

近期开发中遇到对ip地址进行排序问题,普通的按字符串排序不能满足要求,网上查阅资料,大都是把ip地址分段截取,然后排序,方法比较复杂.咨询公司大牛,通过oracle中定义TYPE 和Type Body实现,基本思路就是把字符串类型转成整型,然后比较. 代码如下: CREATE OR REPLACE TYPE "IP_TYPE" as object ( /*------------------------------------------------------------------

uva 1590 - IP Networks(IP地址)

习题4-5 IP网络(IP Networks, ACM/ICPC NEERC 2005, UVa1590) 可以用一个网络地址和一个子网掩码描述一个子网(即连续的IP地址范围).其中子网 掩码包含32个二进制位,前32-n位为1,后n位为0,网络地址的前32-n位任意,后n位为0. 所有前32-n位和网络地址相同的IP都属于此网络. 例如,网络地址为194.85.160.176(二进制为11000010|01010101|10100000|10110000), 子网掩码为255.255.255.

JAVA【long值与ip地址互转】 - ip的判别

阅读前提: 您需要了解什么是 ip地址 本章目的:实现ip地址和 long类型值的互转 一.应用范围 一般用在登录限制.查找IP所在城市等需求中,windows的ping命令也支持整数形式的IP. 二.关键技术点 将IP地址转化成整数的方法如下: 1.通过String的indexOf方法找出IP字符串中的点"."的位置. 2.根据点的位置,使用String的substring方法把IP字符串分成4段. 3.使用Long的parseLong方法把子段转化成一个3位整数. 4.通过左移位操

C# IP地址与数字之间的互转

using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; namespace ip2Long { class Program { static void Main(string[] args) { //首先,输入一个标准的IP地址 例如 192.168.1.1 Console.WriteLine("请输入一个标准的IP地址 例如 192.168.1

怎样快速对二进制和十进制进行互转化——IP地址规划与设计总结

最近一直在看全国计算机三级网络技术这本书,看到第二章的时候,不免会遇到计算机中最常用的进制转换问题.什么IP地址,什么子网掩码,什么网路地址,什么广播地址都会用到二进制和十进制的相互转化,而且最常用的是8位二进制数一组的转化,这就来总结相互转化最快的方法. 首先来认识标准分类的IP地址: IP地址是由网络号与主机号组成的,长度是32bit,用点分十进制方法表示,这样就构成了标准分类的IP地址.常用的A类.B类.C类IP地址采用包括"网络号-主机号"两层结构.通常采用x.x.x.x的方式

MySQL怎样存储IP地址

这两天面试,借贷宝面试官有问到你之前的项目是如何存储ip地址的,我的回答是,存储为varchar字符串类型(事实上我之前参与的项目中的确是采用varchar类型来存储的,但现在想想,当时的场景也仅仅是记录用户操作的地址,也没什么太多用途). 然后,面试官又问我,那你如何查找出A类IP地址的内容,这个时候我就懵了,因为我根本不知道IP地址还分类别,只知道基本格式是从0.0.0.0 ~ 255.255.255 所以,面试也是一种知识的学习,只可惜过程太痛苦,年轻的时候多学点总不是坏处,后悔当初在公司