利用位操作进行IP地址的转化

1)IPv4地址是一个32位的二进制数,通常被分割位4个“8位二进制数”,为了方便,通常使用“点分十进制”的形式表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数,另外,IP地址也可以使用一个3的整数T表示,根据点分十进制中的a,b,c,d,计算T的方法就是:

T=a*256*256*256+b*256*256+c*256+d;

2)那么如何根据T反求出此IP地址的“点分十进制”形式呢?题目描述:

IP地址的长度为32,即有2^32-1个地址。IP地址一般采用点分十进制表示法,例如"192.168.1.1"。IP地址也可以直接用一个32位的整数进行表示。本题目要求根据给定的整数IP地址表示发,将其转换为点分十进制的形式。
举个例子:
      输入整数IP地址为 3232235777
      其对应十六进制为 0xC0A80101
      每字节转为十进制 0xC0=192,0xA8=168,0x01=1,0x01=1
      则输出为 192.168.1.1

有两种方法可以采用,我们首先谈谈怎么使用“位操作”解决这个问题。IP地址实质上是一个32位的二进制形式,虽然说T是一个整数,不过其在计算机存储形式仍然是二进制的形式,使用“位操作”可以方便的得到IP地址中四个网段(也就是4个“8位二进制数”),代码如下:

public static String bitOperation(){
    Long ipAddrLong=0l;
    Scanner scanner=new Scanner(System.in);
    if (scanner.hasNextLong()) {
        ipAddrLong=scanner.nextLong();
    }
    long test;
    StringBuilder sb=new StringBuilder();
    for (int i = 0; i <4; i++) {
        test=(ipAddrLong&0xff);//当与操作的两个操作数位数不一致时,在较少位的操作数左侧补0,直至位数相等
        sb.insert(0, Long.toString(test));//StringBuild的insert()方法很好用
        //sb.append(Long.toString(test));
        if (i<3) {
            sb.insert(0, ".");
        }
        ipAddrLong=ipAddrLong>>8;//无论是左移还是右移,操作数都是在“>>”或者"<<"的左侧,右侧是要改变的位数,并且移动之后,
        //并不改变原操作数的内容,而是新创造了一个数值。左移是将操作数的二进制码整体移动指定位数,所以要操作数最右侧的若干位会丢失,为了保证从操作数
        //的位数不变,在最左侧补上与移动次数相同个数的0。
    }
    return sb.toString();
}

与左移不同的是,右移运算符有两个:“>>”和“>>>”。对于“>>”而言,把操作数的整体二进制码右移指定位之后,左侧空出来的部分使用操作数原来的符号位代替。而“>>>”是无符号右移操作符,左侧空出来的部分总是使用0代替。

参考:http://www.what21.com/programming/java/java-algorithm/ip.html

3)还有另外一种方法可以将IP地址的正数形式转化为“点分十进制”的形式,主要就是取模和取余,代码如下:

1 private static String getIP(Long ipaddr) {
2     long y = ipaddr % 256;
3     long m = (ipaddr - y) / (256 * 256 * 256);
4     long n = (ipaddr - 256 * 256 *256 * m - y) / (256 * 256);
5     long x = (ipaddr - 256 * 256 *256 * m - 256 * 256 *n - y) / 256;
6     return m + "." + n + "." + x + "." + y;
7 } 

参考:http://blog.csdn.net/shb_derek1/article/details/8064308

时间: 2024-08-24 14:35:21

利用位操作进行IP地址的转化的相关文章

python中利用正则表达式匹配ip地址

现在有一道题目,要求利用python中re模块来匹配ip地址,我们应如何着手? 首先能想到的是ip地址是数字,正则表达式是如何匹配数字的呢? \d或[0-9] 对于这个问题,不要一下子上来就写匹配模式,应该一步步分解,把复杂的问题简单化 比如ip地址,我们可以总结一下规律 1. 它是一个字符串 2. 字符串内部是由4个1-3位的数字和3个.组成 3. 数字的范围是0-255 接下来,我们先试一下匹配第1个数字 第一步:尝试匹配192.168.100.123中的192 >>> import

Java网络编程从入门到精通(8):用getAddress方法获得IP地址

getAddress方法和getHostAddress类似,它们的唯一区别是getHostAddress方法返回的是字符串形式的IP地址,而getAddress方法返回的是byte数组形式的IP地址.getAddress方法的定义如下: public byte[] getAddress() 这个方法返回的byte数组是有符号的.在Java中byte类型的取值范围是-128?127.如果返回的IP地址的某个字节是大于127的整数,在byte数组中就是负数.由于Java中没有无符号byte类型,因此

Python之通过IP地址库获取IP地理信息

利用第三方的IP地址库,各个公司可以根据自己的业务情况打造自己的IP地址采集分析系统.例如游戏公司可以采集玩家地区信息,进行有针对性的运营策略,还可能帮助分析玩家网络故障分布等等. #!/usr/bin/env python # -*- coding:utf-8 -*- import requests import json import argparse import sys def get_ip_info(ip): # 淘宝IP地址库 url = "http://ip.taobao.com/

Python自动化运维——IP地址处理模块

Infi-chu: http://www.cnblogs.com/Infi-chu/ 模块:IPy 功能:辅助我们高效的完成IP的规划工作 安装: wget https://pypi.python.org/packages/source/I/IPy/IPy-0.81.tar.gz --no-check-certificate tar -zxvf Ipy-0.81.tar.gz cd IPy-0.81 python setup.py install IP地址.网段的基本处理: 使用方法: #fro

域名转化到IP地址的实现

在linux中,有一些函数可以实现主机名和地址的转化,最常见的有gethostbyname().gethostbyaddr()等,它们都可以实现IPv4和IPv6的地址和主机名之间的转化.其中gethostbyname()是将主机名转化为IP地址,gethostbyaddr()则是逆操作,是将IP地址转化为主机名. 函数原型: 1 #include <netdb.h> 2 3 struct hostent* gethostbyname(const char* hostname); 4 5 st

DNS反射放大攻击分析——DNS反射放大攻击主要是利用DNS回复包比请求包大的特点,放大流量,伪造请求包的源IP地址为受害者IP,将应答包的流量引入受害的服务器

DNS反射放大攻击分析 摘自:http://www.shaojike.com/2016/08/19/DNS%E6%94%BE%E5%A4%A7%E6%94%BB%E5%87%BB%E7%AE%80%E5%8D%95%E5%88%86%E6%9E%90/ 简介 DNS反射放大攻击主要是利用DNS回复包比请求包大的特点,放大流量,伪造请求包的源IP地址为受害者IP,将应答包的流量引入受害的服务器. 简单对比下正常的DNS查询和攻击者的攻击方式: 正常DNS查询:源IP地址 -–DNS查询--> DN

利用mysql的inet_aton()和inet_ntoa()函数存储IP地址的方法分享

当前很多应用都适用字符串char(15)来存储IP地址(占用16个字节),利用inet_aton()和inet_ntoa()函数,来存储IP地址效率很高,适用unsigned int 就可以满足需求,不需要使用bigint,只需要4个字节,节省存储空间,同时效率也高很多 mysql> create table jackbillow (ip int unsigned, name char(1)); Query OK, 0 rows affected (0.02 sec) mysql> inser

【php】利用新浪api接口与php获取远程数据的方法,获取IP地址,并获取相应的IP归属地

本文与<[Servlet]Javaweb中,利用新浪api接口,获取IP地址,并获取相应的IP归属地>(点击打开链接)为姊妹篇,只是后端编程语言换成了php. 做出同样的效果,打开页面,得到客户端的ip,并获取利用新浪api接口获取此ip的归属地. 可以看到,在IE6也是相当正常的. 目录结构如下,非常简单,同样就两个文件,其实如果你愿意,写成一个php文件也可以,但是显示层和逻辑业务层还是不混在一起为好吧? 唯一值得注意的是,这两个文件打死也不能一个叫ipGet.php,ipGet.html

利用Shell命令获取IP地址

一 :获取单个网卡的IPv4地址,方法如下: 方法一:$/sbin/ifconfig ethX | awk '/inet addr/ {print $2}' | cut -f2 -d ":" 方法二:$/sbin/ifconfig ethX | awk '/inet addr/ {print $2}' | awk -F: '{print $2}' 方法三:$/sbin/ifconfig ethX | sed -ne 's/\(.*\)addr:\([[:digit:].]*\)\(.*