分类目录归档:程序开发

Linux下调用openssl的md5类生成文件和字符串md5

找个能使用的c++调用openssl的代码都这么难,自己写了个,记录下。

以下代码在CentOS5下测试可用。

//============================================================================
// Name        : m d 5.cpp
// Author      : Neeao
// Version     :
// Copyright   : http://Neeao.com
//============================================================================

#include <iostream>
#include <openssl/md5.h>
#include <fstream>

using namespace std;
/**
 * 字符串md5
 */
string string_md5(string str)
{
		unsigned char md[16];
		char tmp[33]={'\0'};
		string hash="";
		MD5((const unsigned char*)str.c_str(), str.size(), md);
		for(int i=0; i<16; i++){
				sprintf(tmp, "%02X", md[i]);
				hash+=(string)tmp;
		}
		return hash;
}
/**
 * 文件 md5
 */
string file_md5(string file_name)
{
		MD5_CTX md5;
		unsigned char md[16];
		char tmp[33]={'\0'};
		int length,i;
		char buffer[1024];
		string hash="";
		MD5_Init(&md5);
		ifstream fin(file_name.c_str(),ios::in|ios::binary);
		while(!fin.eof())
			{
						fin.read(buffer, 1024);
						length = fin.gcount();
						if (length > 0) {
							MD5_Update(&md5,buffer, length);
						}
			}
			MD5_Final(md,&md5);
			for(i=0; i<16; i++){
					sprintf(tmp, "%02X", md[i]);
					hash+=(string)tmp;
		    }
			return hash;
}
int main() {
		string file_name = "/root/install.log";
		cout<<file_md5(file_name)<<endl;
		cout<<string_md5(file_name)<<endl;
		return 0;
}

Linux下将Tinyxml编译为静态库

       一个应用需要在Linux服务器上运行,不能保证每个服务器都有应用依赖的库,又懒得每个服务器都去安装下,也不太现实,于是就将应用所用到的库全部编译为静态库,直接丢到服务器上跑吧。此为应用调用xml配置文件依赖tinyxml库示例,记录下,备忘。

      1.下载tinyxml库,直接从官方下载,http://sourceforge.net/projects/tinyxml/。

      2.解压缩下载好的包,我解压缩到test目录下,进入项目目录。

      3.使用vim编辑器修改Makefile文件:

  •  将其中的OUTPUT := xmltest一行修改为:OUTPUT := libtinyxml.a
  • 将xmltest.cpp从SRCS:=tinyxml.cpp tinyxml-parser.cpp xmltest.cpp tinyxmlerror.cpp tinystr.cpp中删除,,注释掉xmltest.o:tinyxml.h tinystr.h。因为不需要将演示程序添加到动态库中。
  • 将${LD} -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS}修改为:${AR} $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS}。
  • 保存退出。

      4.执行make命令编译,即可在当前目录生成libtinyxml.a文件。

      5.调用测试,当前目录新建一个test.cpp文件,内容如下:

#include "tinyxml.h"  
#include "tinystr.h"    
#include <iostream>    
using namespace std;  
   
int main()  
{  
	//创建一个XML的文档对象。  
	TiXmlDocument *myDocument = new TiXmlDocument("test.xml");  
	myDocument->LoadFile();  
      
	//获得根元素,即Persons。  
	TiXmlElement *RootElement = myDocument->RootElement();  
   
	//输出根元素名称,即输出Persons。  
	cout << RootElement->Value() << endl;  
        
	//获得第一个Person节点。  
	TiXmlElement *FirstPerson = RootElement->FirstChildElement();  
	//输出接点名Person  
    
	cout << FirstPerson->Value() << endl;  
	//获得第一个Person的name节点和age节点和ID属性。  
	TiXmlElement *NameElement = FirstPerson->FirstChildElement();  
	TiXmlElement *AgeElement = NameElement->NextSiblingElement();  
	TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();  
       
	//输出第一个Person的name内容,即周星星;age内容,即20;ID属性,即1。  
	cout << NameElement->FirstChild()->Value() << endl;  
	cout << AgeElement->FirstChild()->Value() << endl;  
	cout << IDAttribute->Value() << endl;  
   
        return 0;  
}  

创建test.xml文件,内容如下:

<Persons>  
	<Person ID="1">  
		<name>周星星</name>  
		<age>20</age>  
	</Person>  
	<Person ID="2">  
		<name>白晶晶</name>  
		<age>18</age>  
	</Person>  
</Persons>  

编译当前文件,调用libtinyxml.a库:

[root@server tinyxml]# g++ -o test test.cpp ./libtinyxml.a

执行编译好的程序:

[root@server tinyxml]# ./test
Persons
Person
周星星
20
1

将编译好的test和test.xml放至另外一台没有tinyxml的库,执行成功。

以上代码在centos5.4上测试正常。

一种被混淆过的Java类的反编译算法

1.想看某个Java开发的程序的源码,下了个jad反编译后,发现代码被混淆过,一些定义的String变量被混淆算法混淆了,无法看到原来的字符串了,jad反编译后的混淆过的代码如下:

static 
	{
		String as[];
		as = new String[3];
		as[0] = "P H\"\003j:Np$`5Gp";
		as[1] = "F&[?\005#&\\>\031j:Np\004`5G";
		as[2] = "P7H>W`;D \033f L";
		z = as;
		break MISSING_BLOCK_LABEL_146;
		local;
		toCharArray();
		JVM INSTR dup ;
		JVM INSTR arraylength .length;
		JVM INSTR swap ;
		int i = 0;
		JVM INSTR swap ;
		JVM INSTR dup_x1 ;
		1;
		JVM INSTR icmpgt 125;
		   goto _L1 _L2
_L1:
		JVM INSTR dup ;
		i;
_L4:
		JVM INSTR dup2 ;
		JVM INSTR caload ;
		byte byte0;
		switch (i % 5)
		{
		case 0: // '\0'
			byte0 = 3;
			break;

		case 1: // '\001'
			byte0 = 84;
			break;

		case 2: // '\002'
			byte0 = 41;
			break;

		case 3: // '\003'
			byte0 = 80;
			break;

		default:
			byte0 = 119;
			break;
		}
		byte0;
		JVM INSTR ixor ;
		(char);
		JVM INSTR castore ;
		i++;
		JVM INSTR swap ;
		JVM INSTR dup_x1 ;
		JVM INSTR ifne 125;
		   goto _L3 _L2
_L3:
		JVM INSTR dup2 ;
		JVM INSTR swap ;
		  goto _L4
_L2:
		JVM INSTR swap ;
		JVM INSTR dup_x1 ;
		i;
		JVM INSTR icmpgt 49;
		   goto _L5 _L1
_L5:
		JVM INSTR new #145 <Class String>;
		JVM INSTR dup_x1 ;
		JVM INSTR swap ;
		String();
		intern();
		JVM INSTR swap ;
		JVM INSTR pop ;
		JVM INSTR ret 0;
	}

2.是些JVM的指令,在Google后,找到了些资料,不过一时半会也难理解这些JVM的指令,好在找到了一篇文章,在这里,里面这位童鞋对代码做了分析,和我这个情况一个样,于是乎直接拿代码来用了,把里面的关键部分提取出来,写了个函数,方便调用。

3.我写的函数及测试代码:

package com.neeao.com;

public class neeao {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String as[];
		as = new String[3];
		String z[];
		as[0] = "P H\"\003j:Np$`5Gp";
		as[1] = "F&[?\005#&\\>\031j:Np\004`5G";
		as[2] = "P7H>W`;D \033f L";
		z = as;
		
		for (int m = 0; m < z.length; m++) {
			z[m] = Decode(z[m]);
		}
		 for (int l = 0; l < z.length; l++) {
			 System.out.println("" + l + ": " + z[l]);
		 }
		//System.out.print(Decode(OPT_QUICK_SCAN));
		System.out.print("test");
	}
	/**
	 * 解码函数
	 * @param string 要解码的字符串
	 * @return
	 */
	public static String Decode(String string)
	{
		byte[] con=new byte[] {3,84,41,80,119};
		char[] ch = string.toCharArray();
		for (int i = 0; i < ch.length; i++) {
			//System.out.print(con[i%5]+"\n");
			ch[i] =(char) (ch[i]^con[i%5]);
		}
		return new String(ch);
	}

}

其中decode就是解码函数了,里面的con数组对应jad反编译后代码中的byte0这个变量的switch的5个值。

4.执行后的输出:

0: Starting Scan
1: Error running scan
2: Scan complete
test

VC++调用libcurl的VC库使用详解

1.开发环境。我这里环境是VC.net 2003+windows XP sp3.

2.下载官方库。地址:http://curl.haxx.se/download.html  搜索  Win32 – MSVC,下面有两个版本的库,一个是带ssl的,一个是不带ssl的。我把两个都下载了下来:

不带ssl的:http://curl.haxx.se/download/libcurl-7.18.0-win32-msvc.zip

带ssl的:http://curl.haxx.se/download/libcurl-7.19.3-win32-ssl-msvc.zip

3.解压缩。把下载后的两个zip包分别加压缩,我这里保存到E:\source目录下面,两个目录分别是:

E:\source\libcurl-7.18.0-win32-msvc

E:\source\libcurl-7.19.3-win32-ssl-msvc

4.VC.net设置。

不带ssl的:工具-》选项-》项目-》VC++目录-》

平台默认是win32,选择显示以下文件的目录-》包含文件,添加新行:

路径选择为刚才解压缩的目录E:\source\libcurl-7.18.0-win32-msvc\目录下的include目录,全路径为:

E:\source\libcurl-7.18.0-win32-msvc\include

再选择库文件,添加新行:

路径设置为libcurl的存放目录,我这里设置为E:\source\libcurl-7.18.0-win32-msvc。

如果使用ssl的包的话,那只需要替换为路径E:\source\libcurl-7.19.3-win32-ssl-msvc即可。

5.新建win32项目.默认设置即可。我这里新建curl项目,默认curl.cpp文件中添加:

include头文件:

#include <curl/curl.h>

引用库文件,:

#pragma comment(lib, "libcurl.lib")

如果为ssl的包的话,则引用库文件为:

#pragma comment(lib, "libcurl_imp.lib")

然后在man函数中添加代码:

CURL *curl;

    CURLcode res;

    curl = curl_easy_init();

    if(curl) {

       curl_easy_setopt(curl, CURLOPT_URL,

           "http://www.baidu.com/");

       res = curl_easy_perform(curl);

       /* always cleanup */

       curl_easy_cleanup(curl);

    }

    system("pause");

6.执行。

因为直接使用VC的包,所以需要把相应的dll文件copy只项目目录下的debug目录下,要不会提示找不到dll。

不带ssl的包,只需拷贝libcurl存放路径下的libcurl.dll文件到debug目录即可。

包含ssl的包,需要拷贝libcurl目录下的所有dll文件到debug目录。

7.若为ssl的包的话,到这里可以正常执行,不包含ssl的包,这里执行则会报错:

没有找到zlib1.dll文件。

通过Google找到的zlib1.dll文件不能直接使用,仍然会报错:

无法定位序数55于zlib1.dll

这时,到http://gnuwin32.sourceforge.net/downlinks/zlib-bin-zip.php下载zib包,将dll文件拷贝至debug目录,程序即可正常执行了。

8,如果你生成release版本的程序,则相应的把dll文件copy至项目的release目录即可

 

参考文章:

0.http://blog.xuite.net/kim11913/acgworld/28440792 (需要拿梯子才能访问)

1.http://blog.chinaunix.net/u/25096/showart_388890.html

C++读取“aux”,“com*”文件

Windows 下不能够以下面这些字样来命名文件/文件夹,包括:“aux”,“com1”“com2”“prn”“con”和“nul”等,但是通过cmd下是可以创建此类文件夹的,使用copy命令即可实现:

这种文件通过gui是无法访问的,如下图:

但是通过IIS还是可以解析这个文件的:

那么是否可以用程序读取么,于是乎就测试了一下,用VS2003创建了一个项目,代码如下:

#include "stdafx.h"
#include <fstream>
#include <string>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
 ifstream fin("F:\\asp\\com1.asp");
 string s; 
    while(getline(fin,s) )
    {   
        cout << "Read from file: " << s << endl;
    }
 system("pause");
 return 0;
}
读取com1.asp并输出,如果可以读取的话,可以输出com1.asp内容,看图:

没有任何输出,看起来是不能直接读取了,Google一把:

http://blog.sina.com.cn/s/blog_4a72966b01000ana.html

找到这篇文章,说cmd下删除aux文件的,那我们通过其中说的方法看能不能读取,修改下代码:

#include "stdafx.h"
#include <fstream>
#include <string>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
 ifstream fin("\\\\.\\F:\\asp\\com1.asp");
 string s; 
    while(getline(fin,s) )
    {   
        cout << "Read from file: " << s << endl;
    }
 system("pause");
 return 0;
}
运行下看看:

可以正常读取了,^_^。