开发者社区> gnuhpc> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介: 作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/   1.用途 将一个整型数值和一个IP字符串相互转换。 2.描述语言 C, Java 3.原理 IP地址是一个以点作为分隔符的十进制四字段字符串,例如“10.0.3.193”。
+关注继续查看

 作者: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/


               作者:gnuhpc
               出处:http://www.cnblogs.com/gnuhpc/
               除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。


分享到:

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
一图抵万言:信息图的五大用途
大数据是2013年被热炒的概念,但即使在专业人群中,能弄明白大数据的人并不多。而信息图(Infographics)不同,作为当今最流行的数据可视化展示方式,信息图是向非专业人士展示数据分析结果的最直观最有效的工具之一。
901 0
自定义带进度条的WebView , 增加获取web标题和url 回掉
1、自定义ProgressWebView package com.app.android05; import android.content.Context; import android.
718 0
【Programming Clip】位运算的应用
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1.用途 利用位运算,完成判断两个数字直接二进制的差异,数值交换,判断是否为2的次方,以及判断机器是SMALL_ENDIAN还是BIG_ENDIAN等。
456 0
好程序与差程序Good Programming, Bad Programming
好程序与差程序 Good Programming, Bad Programming 发布时间: 2012-11-20 16:32:21| 阅读数:2,735 views 优秀的程序可以使复杂的东西看起来很简单;糟糕的程序让原本简单的东西变得复杂。
585 0
如何将我们的大型机转化为数字业务资源?
IBM的云计算发展方向将帮助大型企业一步步迈向数字业务目标。也只有这样,企业才能在不影响质量、安全性与预算的前提下,充分发挥大型机应用程序与数据中蕴藏的价值,帮助自身在激烈的市场竞争中找到新的优势空间。
72 0
【实操系列】AnalyticDB PostgreSQL 万倍查询加速——使用实时物化视图加速带可变参数的查询
以TPCH Q1为例,介绍一个优化案例,使用AnalyticDB PostgreSQL的实时物化视图+自动查询改写,近万倍优化带可变参数的OLAP查询
0 0
阿里云|MongoDB中国区域游戏行业私享会
原厂技术加持,客户现身说法。
0 0
6. 抹平差异,统一类型转换服务ConversionService(下)
6. 抹平差异,统一类型转换服务ConversionService(下)
0 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载