使用Java代码将IP地址转换为int类型的方法

 更新时间:2015年08月07日 10:24:56   作者:zinss26914  
这篇文章主要介绍了使用Java代码将IP地址转换为int类型的方法,这也是各大计算机考试和ACM以及面试的常见基础问题,需要的朋友可以参考下

基本知识点 
 
IP ——> 整数:
把IP地址转化为字节数组
通过左移位(<<)、与(&)、或(|)这些操作转为int
整数 ——> IP:
将整数值进行右移位操作(>>>),右移24位,再进行与操作符(&)0xFF,得到的数字即为第一段IP。
将整数值进行右移位操作(>>>),右移16位,再进行与操作符(&)0xFF,得到的数字即为第二段IP。
将整数值进行右移位操作(>>>),右移8位,再进行与操作符(&)0xFF,得到的数字即为第三段IP。
将整数值进行与操作符(&)0xFF,得到的数字即为第四段IP。

思路
ip地址转int类型,例如ip为“192.168.1.116”,相当于“.“将ip地址分为了4部分,各部分对应的权值为256^3, 256^2, 256, 1,相成即可

int类型转ip地址,思路类似,除以权值即可,但是有部分字符串的操作


代码

  #include <stdio.h> 
  #include <stdlib.h> 
  #include <string.h> 
  #include <math.h> 
   
  #define LEN 16 
   
  typedef unsigned int uint; 
   
  /** 
   * 字符串转整形 
   */ 
  uint ipTint(char *ipstr) 
  { 
    if (ipstr == NULL) return 0; 
   
    char *token; 
    uint i = 3, total = 0, cur; 
   
    token = strtok(ipstr, "."); 
   
    while (token != NULL) { 
      cur = atoi(token); 
      if (cur >= 0 && cur <= 255) { 
        total += cur * pow(256, i); 
      } 
      i --; 
      token = strtok(NULL, "."); 
    } 
   
    return total; 
  } 
   
  /** 
   * 逆置字符串 
   */ 
  void swapStr(char *str, int begin, int end) 
  { 
    int i, j; 
   
    for (i = begin, j = end; i <= j; i ++, j --) { 
      if (str[i] != str[j]) { 
        str[i] = str[i] ^ str[j]; 
        str[j] = str[i] ^ str[j]; 
        str[i] = str[i] ^ str[j]; 
      } 
    } 
  } 
   
  /** 
   * 整形转ip字符串 
   */ 
  char* ipTstr(uint ipint) 
  { 
    char *new = (char *)malloc(LEN); 
    memset(new, '\0', LEN); 
    new[0] = '.'; 
    char token[4]; 
    int bt, ed, len, cur; 
   
    while (ipint) { 
      cur = ipint % 256; 
      sprintf(token, "%d", cur); 
      strcat(new, token); 
      ipint /= 256; 
      if (ipint) strcat(new, "."); 
    } 
   
    len = strlen(new); 
    swapStr(new, 0, len - 1); 
   
    for (bt = ed = 0; ed < len;) { 
      while (ed < len && new[ed] != '.') { 
        ed ++; 
      } 
      swapStr(new, bt, ed - 1); 
      ed += 1; 
      bt = ed; 
    } 
   
    new[len - 1] = '\0'; 
   
    return new; 
  } 
   
  int main(void) 
  { 
    char ipstr[LEN], *new; 
    uint ipint; 
   
    while (scanf("%s", ipstr) != EOF) { 
      ipint = ipTint(ipstr); 
      printf("%u\n", ipint); 
   
      new = ipTstr(ipint); 
      printf("%s\n", new); 
    } 
   
    return 0; 
  } 

相关文章

  • Java IO之流的分类详解

    Java IO之流的分类详解

    这篇文章主要为大家介绍了Java IO之流的分类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • Java的SpringMVC中控制器返回XML数据问题

    Java的SpringMVC中控制器返回XML数据问题

    这篇文章主要介绍了Java的SpringMVC中控制器返回XML数据问题,控制器是处理HTTP请求的组件,它们接收来自客户端的请求,并将其转换为适当的响应,这些响应可以是动态生成的 HTML 页面,也可以是JSON或XML格式的数据,需要的朋友可以参考下
    2023-07-07
  • JDK8通过Stream 对List,Map操作和互转的实现

    JDK8通过Stream 对List,Map操作和互转的实现

    这篇文章主要介绍了JDK8通过Stream 对List,Map操作和互转的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • java Scanner输入数字、字符串过程解析

    java Scanner输入数字、字符串过程解析

    这篇文章主要介绍了java Scanner输入数字、字符串过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • httpclient重定向之后获取网址信息示例

    httpclient重定向之后获取网址信息示例

    使用HttpClient进行127.0.0.1:8080地址的问题,然后该地址自动重定向127.0.0.1:8080/mobserver,如何获取该地址呢?使用HttpContext,下面是示例
    2014-02-02
  • Java开发框架spring实现自定义缓存标签

    Java开发框架spring实现自定义缓存标签

    这篇文章主要介绍了Java开发框架spring实现自定义缓存标签的详细代码,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • springboot下mybatis-plus如何打印sql日志和参数到日志文件

    springboot下mybatis-plus如何打印sql日志和参数到日志文件

    本文主要介绍了springboot下mybatis-plus如何打印sql日志和参数到日志文件,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • java selenium 操作弹出窗口示例代码

    java selenium 操作弹出窗口示例代码

    本文主要介绍java selenium 操作弹出窗口,这里实例讲解操作弹出窗口详细流程,并附示例代码,有需要的小伙伴可以参考下
    2016-08-08
  • easyExcel分批导入文件方式

    easyExcel分批导入文件方式

    这篇文章主要介绍了easyExcel分批导入文件方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 使用Mybatis更新时候只更新变更部分的方法

    使用Mybatis更新时候只更新变更部分的方法

    这篇文章主要介绍了使用Mybatis更新时候只更新变更部分的方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03

最新评论