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

基本知识点 
 
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;
  }
(0)

相关推荐

  • C++ 类中有虚函数(虚函数表)时 内存分布详解

    虚函数表 对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的.简称为V-Table.在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承.覆盖的问题,保证其容真实反应实际的函数.这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数. 这里我们着重看一下这张虚函数表.C++的编译器应该是

  • C++中输出十六进制形式的字符串

    前言 在进行 i18n 相关的开发时,经常遇到字符编码转换的错误.这时如果能把相关字符串用十六进制的形式打印出来,例如,"abc" 输出成 "\\x61\\x62\\x63" 这对于 i18n 的除错来说是很有帮助的.Python 里面,只需要使用 repr() 函数就行了.可在 C++ 中如何做到这点呢? 下面是用 ostream 的格式化功能的一个简单的实现: std::string get_raw_string(std::string const& s

  • C++中vector和map的删除方法(推荐)

    1.连续内存序列容器(vector,string,deque) 序列容器的erase方法返回值是指向紧接在被删除元素之后的元素的有效迭代器,可以根据这个返回值来安全删除元素. vector<int> c; for(vector<int>::iterator it = c.begin(); it != c.end();) { if(need_delete()) it = c.erase(it); else ++it; } 2.关联容器(set,multiset,map,multima

  • 使用C/C++语言生成一个随机迷宫游戏

    迷宫相信大家都走过,毕竟书本啊啥啥啥的上面都会有迷宫,主要就是考验你的逻辑思维.那么我们学习C/C++也是需要学习到逻辑思维方式的,那今天我就来分享一下,如何用C/C++打造一个简单的随机迷宫游戏.(代码的话我只截取了如何创建迷宫的代码,如果想要全套代码的话可以加群:558502932,群内有很多C/C++学习资料提供学习,大家一起交流进步) 完整版的迷宫游戏效果如下: 代码如下: //创建迷宫 void CreateMaze(int x,int y) { //定义4个方向 int dir[4]

  • c++连接mysql5.6的出错问题总结

    1.描述:链接的时候出错了,错误提示:无法解析的外部符号 _mysql_init@4,该符号在函数 _main 中被引用 原因:我的机器是64bit WIN7系统,VS2012是32bit的,而MySQL是64bit的,32位工程调用64bit的libmysql.lib,因此连接出错啦. 解决:重新安装32bit的MySQL即可. 2.描述:编译出错, 1>c:\program files (x86)\mysql\mysql server 5.6\include\mysql_com.h(320)

  • C/C++ ip地址与int类型的转换实例详解

    C/C++ ip地址与int类型的转换实例详解 前言 最近看道一个面试题目,大体意思就是将ip地址,例如"192.168.1.116"转换成int类型,同时还能在转换回去 思路 ip地址转int类型,例如ip为"192.168.1.116",相当于"."将ip地址分为了4部分,各部分对应的权值为256^3, 256^2, 256, 1,相成即可 int类型转ip地址,思路类似,除以权值即可,但是有部分字符串的操作 实现代码 #include &l

  • 浅谈C++对象的内存分布和虚函数表

    c++中一个类中无非有四种成员:静态数据成员和非静态数据成员,静态函数和非静态函数. 1.非静态数据成员被放在每一个对象体内作为对象专有的数据成员. 2.静态数据成员被提取出来放在程序的静态数据区内,为该类所有对象共享,因此只存在一份. 3.静态和非静态成员函数最终都被提取出来放在程序的代码段中并为该类所有对象共享,因此每一个成员函数也只能存在一份代码实体.在c++中类的成员函数都是保存在静态存储区中的 ,那静态函数也是保存在静态存储区中的,他们都是在类中保存同一个惫份. 因此,构成对象本身的只

  • 浅谈C++ Explicit Constructors(显式构造函数)

    C++ 为类(Class)提供了许多默认函数.如果自己没有申明,编译器会为我们提供一个copy构造函数.一个copy assignment操作符和一个析构函数.此外,如果没有申明任何构造函数,编译器会为我们申明一个default构造函数.很像下面的Empty类: class Empty{ public: Empty(); Empty(const Empty &rhs); ~Empty(); Empty& operator=(const Empty &rhs); }; 就像Effec

  • C++ Template应用详解

    引言 模板(Template)指C++程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计.C++ 的标准库提供许多有用的函数大多结合了模板的观念,如STL以及IO Stream. 函数模板 在c++入门中,很多人会接触swap(int&, int&)这样的函数类似代码如下: void swap(int&a , int& b) { int temp = a; a = b; b = temp; } 但是如果是要支持long,string,自定义class的swap函

  • C/C++ 读取16进制文件的方法

    1.为什么有这种需求 因为有些情况需要避免出现乱码.不管什么编码都是二进制的,这样表示为16进制就可以啦. 2.如何读取16进制文件 最近编程用这一问题,网上查了一下,感觉还是自己写吧. 16进制数据一般是:text=0x340xb5...,就是0x开头,之后是两个数字十六进制数. 如果直接使用sscanf(text,"0x",&num),会把连续的数字读进去直到遇到'x'. 如使用sscanf读取text第一个读到的十六进制数是0x340,误判啦.最后,因为是4个一组,就先把

随机推荐