C++怎么把long类型数据转换成IP地址格式?windows环境。要有具体代码。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++怎么把long类型数据转换成IP地址格式?windows环境。要有具体代码。相关的知识,希望对你有一定的参考价值。

主要思路就是位运算,左移和右移。先介绍下:

左移运算:x << y。将x左移y位,将x最左边的y位丢弃,在右边补y个0。

右移运算:x >> y。将x右移y位,这需要区分x是有符号数还是无符号数。在x是无符号数时,只需将x的最右边的y位丢弃,在左边补上y个0。在x是有符号数时,又分为x是正数还是负数。正数时,同无符号数的处理相同;负数时,将将x的最右边的y位丢弃,在左边补上y个1。(http://blog.csdn.net/zouliping123/article/details/8995373)

具体实现效果如下图:


#include <iostream>
#include <string>

int main()


unsigned long ipAddres = 0xffeeddcc; //ip是4段,每段都是0~255的范围,就是每段是1个byte,总共4个byte,long的大小是4byte,但是要用无符号的
unsigned char ip[4];//可以用4个unsigned char来保存IP,数据范围0~255
for (int i = 0;i < 4;++i)

unsigned long temp = ipAddres << (2 * i) * 4; //每次先把需要ip数据移到最左边
temp = temp >> 6 * 4; //然后把最左边的两位移到最低位
ip[i] = (unsigned char )temp ; //强制转换成unsigned char保存

return 0;

0xffeeddcc中,要把ee移到ff的位置上要向左边移动1个byte,8个bit。如i=1时,上面循环中temp = ipAddres << (2 * i) * 4
,即往左移动1个byte,temp=0xeeddcc00; temp =temp >> 6 * 4 即每次右移3个byte,temp=0x000000ee; 最后ip[1]=0xee;

参考技术A 用API可以,但有更简单的办法:
#include "stdio.h"
char IP[32]; // 存放IP串
long ip1; // 原long型IP地址
unsigned char *p=(unsigned char *)&ip1;
sprintf(IP,"%d.%d.%d.%d",(int)p[0],(int)p[1],(int)p[2],(int)p[3]);
// IP
参考技术B 使用inet_ntoa函数即可

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int main(int argc, char *argv[])

struct in_addr addr1,addr2;
ulong l1,l2;
l1= inet_addr("192.168.0.74");
l2 = inet_addr("211.100.21.179");
memcpy(&addr1, &l1, 4);
memcpy(&addr2, &l2, 4);
printf("%s : %s\n", inet_ntoa(addr1), inet_ntoa(addr2)); //注意这一句的运行结果
printf("%s\n", inet_ntoa(addr1));
printf("%s\n", inet_ntoa(addr2));
return 0;

实际运行结果如下:
192.168.0.74 : 192.168.0.74 //从这里可以看出,printf里的inet_ntoa只运行了一次。
192.168.0.74
211.100.21.179
inet_ntoa返回一个char *,而这个char *的空间是在inet_ntoa里面静态分配的,所以inet_ntoa后面的调用会覆盖上一次的调用。第一句printf的结果只能说明在printf里面的可变参数的求值是从右到左的,仅此而已。  

参考资料:http://baike.baidu.com/view/569200.htm

参考技术C long l = value;
struct in_addr addr;
addr.S_addr = l;
char *s = inet_ntoa(addr);本回答被提问者采纳

jsp 怎么把日期转化成timestamp

用户在前台页面输入String 类型的日期,格式为YYYY-MM-DD,去查询当天日期的国际汇款的报文信息。而数据存储的时间格式是Timestamp默认格式,明显的类型不匹配,需要类型转换。
用户输入的是年月日(YYYY-MM-DD)而数据库是(YYYY-MM-DD HH:MM:SS)
用户不可能精确到时分秒去查询当然很不现实。
下面是类型转换的方法。

public final static Timestamp string2Time(String dateString)
throws java.text.ParseException

DateFormat dateFormat;
dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINESE);// 设定格式
dateFormat.setLenient(false);// 严格控制输入 比如2010-02-31,根本没有这一天 ,也会认为时间格式不对。
Date timeDate = dateFormat.parse(dateString);// util类型
Timestamp dateTime = new Timestamp(timeDate.getTime());// Timestamp类型,timeDate.getTime()返回一个long型
return dateTime;

public static void main(String[] args) throws ParseException
String date="2010-05-31";
Timestamp timestamp = DateUtils.string2Time(date);
System.out.println(timestamp);
timestamp.setDate(timestamp.getDate()+1);
Timestamp lasttime = new Timestamp(timestamp.getTime());
System.out.println(lasttime);
// CommonUtils.TimeStamp2Date(timestamp);
// testSplit();

在这里返回了一个Timestamp对象。
参考技术A 404 是你路径问题 ,估计是你在URL 中写错了 ,action.do?timetamp="+new Date().getTIme()+"

以上是关于C++怎么把long类型数据转换成IP地址格式?windows环境。要有具体代码。的主要内容,如果未能解决你的问题,请参考以下文章

在c++中怎么把long转换成int

如何把一个long型转换成日期

0727-每日一练-IP字符串转Long

excel 怎么把IP地址转换成000.000.000.000的格式

怎么将long类型转换成date

请教在C++里如何把string类型转换成long型?