作者:gnuhpc 
出处:http://www.cnblogs.com/gnuhpc/

1.用途

将一个整型数值和一个IP字符串相互转换。

2.描述语言

C, Java

3.原理

IP地址是一个以点作为分隔符的十进制四字段字符串,例如“10.0.3.193”。将这四个十进制数转化为二进制即为:

每段数字             相对应的二进制数
10                          00001010
0                            00000000
3                            00000011
193                       11000001

以从左到右的顺序放在一起,为00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即为一个长整型。

从长整型到字符串的转化要点:移位、屏蔽掉不需要的位,字符串拼接。在C语言中可以使用指针巧妙的封装移位操作。

从字符串到长整型的转化要点:解析字符串,移位,求和。

4.代码

C语言描述:

/** =====================================================================================**       Filename:  ipconverter.cpp**    Description:  **        Version:  1.0*        Created:  01/08/2012 11:02:12 PM*       Revision:  none*       Compiler:  gcc**         Author:  gnuhpc (http://www.cnblogs.com/gnuhpc), warmbupt@gmail.com*        Company:  CMBC** =====================================================================================*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>using namespace std;char* itoa(int i)
{char* temp = new char(6);sprintf(temp,"%d",i);return temp;
}char* numToIP1(unsigned int num)
{char* buf = new char[sizeof("aaa.bbb.ccc.ddd")];unsigned char* p = (unsigned char *)&num;sprintf(buf, "%d.%d.%d.%d", p[3]&0xff,p[2]&0xff,p[1]&0xff,p[0]&0xff);return buf;
}
char* numToIP2(unsigned int num)
{char* buf = new char[sizeof("aaa.bbb.ccc.ddd")];for(int i=3;i>=0;i--){strcat(buf, itoa((num>>8*i)&0xff));if(i!=0)strcat(buf,".");}return buf;
}unsigned int ipToNum(char* ip)
{char* p;int sections[4]={0};int i=0;p = strtok(ip,".");while( p ){sections[i] = atoi(p);p = strtok(NULL,".");cout << sections[i] << endl;i++;}unsigned int num =0;for( int j=3,i=0 ; j>=0 ; j--,i++ ){num += (sections[i] <<(8*j));}return num;
}int main(){char* p = numToIP1(167773121);cout << p << endl;delete p;p = numToIP2(167773121);cout << p << endl;delete p;char ip[16] = "10.0.3.193";cout << ipToNum(ip) << endl;return 0;
}

Java描述:

package cnblogs.gnuhpc.ipconvertor;public class IPConvertor {public static String numToIP(long ip){StringBuilder sb = new StringBuilder();for (int i = 3; i >=0; i--) {sb.append((ip>>>(i*8))&0x000000ff);if (i!=0) {sb.append('.');}}System.out.println(sb);return sb.toString();}public static long ipToNum(String ip){long num = 0;String[] sections = ip.split("\\.");int i=3;for (String str : sections) {num+=(Long.parseLong(str)<<(i*8));i--;}System.out.println(num);return num;}
}

5.收获

1)C语言中unsigned int类型为4字节,范围为0 -> +4,294,967,295 ,而long int也为4字节,只是其从0开始,范围为-2,147,483,648 -> +2,147,483,647 。Java中没有unsigned类型,long类型为8 字节,范围为 -9,223,372,036,854,775,808 to +9,223,372,036,854,775,807.

2)Java中String.split方法,如果用“.”作为分隔的话,必须采用:String.split("\\."),这样才能正确的分隔开,不能用String.split(".")。

3)Java中的位移:

<<是左移符号,列x<<1,就是x的内容左移一位(x的内容并不改变) >>是带符号位的右移符号,x>>1就是x的内容右移一位,如果开头是1则补1,是0责补0,(x的内容并不改变) >>>是不带符号位的右移,x>>>1就是x的内容右移一位,开头补0(x的内容并不改变)

6.下载地址

http://gnuhpc.googlecode.com/svn/trunk/ProgrammingExc/src/cnblogs/gnuhpc/ipconvertor/

【Programming Clip】点分十进制IP和长整型转换相关推荐

  1. Java实现点分十进制IP和长整型转换

    转载:http://blog.csdn.net/lin111000713/article/details/16337391 原理: IP地址是一个以点作为分隔符的十进制四字段字符串,例如"1 ...

  2. python中复数的实部和虚部都是浮点数_Python基础:数值(布尔型、整型、长整型、浮点型、复数)...

    一.概述 Python中的 数值类型(Numeric Types)共有5种:布尔型(bool).整型(int).长整型(long).浮点型(float)和复数(complex). 数值类型支持的主要操 ...

  3. 点分十进制IP校验、转换,掩码校验

    /****************************************************************************** 点分十进制IP校验.转换,掩码校验* 声 ...

  4. java长整型转换为整型_java ip地址转换为长整型

    java ip地址转换为长整型 java ip地址转换为长整型: public class Util { /** * 字符串ip转换为long * @param 字符串ip * @return */ ...

  5. 将ip地址转换成一个长整型(日志处理)

    //将ip地址转换成一个长整型 def ip2Long(str:String): Long ={val fields: Array[String] = str.split("\\." ...

  6. 字符IP地址和整型数转换

      IP(Internet Protocol),IP地址中文名称为互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写.IP地址 ...

  7. python长整型是什么_Python【数据类型】

    我们人类可以很容易的分清数字与字符的区别,但是计算机并不能呀,计算机虽然很强大,但从某种角度上看又很傻,除非你明确的告诉它,1是数字,"汉"是文字否则它是分不清1和汉的区别的,因此 ...

  8. printf中如何输出长整型?

    资料出处: http://hi.baidu.com/iamstupid/blog/item/26b9c0d0b63e9e8ba0ec9c84.html printf中如何输出 长整型? 一直都听说gc ...

  9. Java的长整型Long/long后面的数字什么情况下必须加L?

    [1] 问题的由来   在日常开发中,实体类需要序列化,一般写法如下: public class User implements java.io.Serializable {private stati ...

最新文章

  1. 安装Ubuntu13.10后必做的10件事
  2. OpenGL程序演示
  3. 【城市沙龙】LiveVideoStack Meet|杭州:多媒体新黄金时代
  4. SQL - server 数据库基础知识
  5. FastJson PropertyNamingStrategy 转换成JSON字符串的四种格式配置及源码解析
  6. LRU算法java实现
  7. WebSphere 管理员界面 修改配置之后,没有反应的原因,需要按下[保存]link
  8. 静态成员变量和非静态成员变量
  9. php+mysql数据库语法错误_求教:PHP+MYSQL制作用户登录系统问题,总是提示数据库查询语句语法不对。$sql=mysql_query(。。。)这行...
  10. 大智慧服务器修改,任意版本大智慧,帮您免费实现全推行情
  11. plsql 导入导出数据
  12. tab切换之图片切换
  13. ubuntu系统给u盘拷贝文件
  14. Freebase SPARQL 查询模板
  15. 35岁的程序员:第14章,前奏
  16. Linux递归修改后缀名
  17. 网易2019实习生招聘编程题集合 - 题解
  18. load函数matlab,『matlab load函数的用法』如何把matlab中的数据导到excel表格中
  19. 冯·诺依曼体系结构介绍
  20. 企业高管IT战略指南——企业为何要落地DevOps?

热门文章

  1. java基础(5)-集合类1
  2. windows 7 引导过程概述
  3. 怎样获取UIWebView 的文字的高度
  4. 将职业教育职业化 - 各IT培训中心必须完成的使命
  5. 域中添加电脑提示重名
  6. linux每日命令(11):cat命令
  7. 【吴恩达机器学习】学习笔记——1.3机器学习的定义
  8. Hadoop群集设置
  9. 使用 IntraWeb (10) - CSS
  10. ftp挂载分区上去后无法识别的问题