0.序
1.方法1:利用MD5Init, MD5Update,MD5Final(没有得到正确md5)
2.利用他人编写好的库libleomd5.so
1)编译说明
2)程序中调用动态链接库.so
3.所需库文件
|
0.序
方法1:
常见的计算md5的方法是利用
MD5Init
,
MD5Update
,
MD5Final等函数来计算文件的md5值,关于函数的一个详细介绍请见
http://manpages.ubuntu.com/manpages/lucid/man3/md5.3bsd.html
方法2:
利用他人编写好的库来计算。
1.方法1:利用MD5Init, MD5Update,MD5Final
其程序如下:
/*
文件名:
md5test.c
**
编辑:
yankai
**
日期:
2012/12/07
*/
/*
在使用
MD5init
等函数时,经常出现不能定义
MD5init
等情况。
解决方法
1.
安装
apt-get install libbsd
2.
编译时
-lbsd
3.
编译命令
gcc -o md5test md5test.c -lbsd
4.
执行
./md5test
5.
注意:本程序固定了文件的路径,因此在测试时,需要手动修改文件的路径,文件才能正确执行
6.
注意:该程序并没有得到正确的
md5
值,还请大家指正
*/
#include
<openssl/md5.h>
#include
<stdlib.h>
#include
<sys/types.h>
#include
<stdio.h>
#define
MD5_DIGEST_LENGTH 16
typedef
struct
ngx_http_upload_md5_ctx_s {
MD5_CTX md5;
u_char md5_digest[MD5_DIGEST_LENGTH * 2];
} ngx_http_upload_md5_ctx_t;
int
main()
{
u_char * file_path =
"/home/hpnl/Downloads/test/md5/123.txt"
;
ngx_http_upload_md5_ctx_t *md5_ctx = NULL;
md5_ctx = (ngx_http_upload_md5_ctx_t*)malloc(
sizeof
(ngx_http_upload_md5_ctx_t));
if
(NULL == md5_ctx){
printf(
"malloc error\n"
);
return
0;
}
MD5Init(&md5_ctx->md5);
FILE *pfile;
int
buffer_size = 1024;
int
read_size = 0;
unsigned
char
* buffer = (
unsigned
char
*)malloc(
sizeof
(
unsigned
char
) * buffer_size);
if
((pfile = fopen((
char
*)file_path,
"rb"
)) == NULL)
return
1;
while
( (read_size = fread(buffer,1,buffer_size,pfile)) != EOF){
MD5Update(&md5_ctx->md5,buffer,read_size);
if
(read_size < buffer_size)
break
;
}
MD5Final(md5_ctx->md5_digest,&md5_ctx->md5);
printf(
"upload_ctx->yk_md5_ctx:->md5_digest :%s\n"
,md5_ctx->md5_digest);
free(buffer);
return
0;
}
|
2.利用他人编写好的库libleomd5.so
1
)编译说明
/* * 编译方法 * * gcc -o md5test md5test.c libleomd5.so * 此方法需要将libleomd5.so复制到系统路径下,例如/usr/lib * * gcc -o md5test md5test.c ./libleomd5.so * 此方法需要将libleomd5.so复制到test所在路径下 * * bayern.leo@gmail.com */ |
2)程序中调用动态链接库.so
另外,我不希望在使用gcc编译的时候添加动态链接库,我更希望的是使用库文件。那么我该如何进行呢?通过搜索,我发现可以 使用dlopen函数在程序中添加动态链接库。当然在编译的时候还需要添加dlopen函数所在的lib文件。
在linux中
man dlopen
NAME dladdr, dlclose, dlerror, dlopen, dlsym, dlvsym - programming interface to dynamic linking loader SYNOPSIS #include <dlfcn.h> void *dlopen(const char *filename, int flag); char *dlerror(void); void *dlsym(void *handle, const char *symbol); int dlclose(void *handle); Link with -ldl. |
关于dlopen的使用,有一个简单例子详见:http://blog.csdn.net/smallsky_keke/article/details/7372184
3)libleomd5.so动态文件计算文件md5
现在我将利用libleomd5.so动态文件计算文件md5的程序列出
/*
文件名:
md5test2.c
**
编辑:
yankai
**
日期:
2012/12/07
*/
/*
1.
编译命令
gcc -o md5test2 md5test2.c -ldl
2.
执行
/md5test2
3.
注意:本程序固定了文件的路径,因此在测试时,需要手动修改文件的路径,文件才能正确执行
4. 注意:需要将libleomd5.so文件放于/usr/lib/目录下,其实只要与dlopen的路径一致即可
*/
#include
<dlfcn.h>
#include
<string.h>
int
*(*pnMDFile)(
char
*);
#define
FILE_MD5_LEN 33
int
main(
int
argc,
char
* argv[]) {
void
*pdlHandle = dlopen(
"/usr/lib/libleomd5.so"
,RTLD_LAZY);
pnMDFile=dlsym(pdlHandle,
"MDFile"
);
char
* file_md5;
char
* filepath =
"/home/hpnl/Downloads/test/md5/123.txt"
;
file_md5 = (
char
*)malloc(
sizeof
(
char
) * FILE_MD5_LEN);
strncpy(file_md5,(
char
*)pnMDFile(filepath),strlen((
char
*)pnMDFile(filepath)) );
*(file_md5 + FILE_MD5_LEN -1) =
'\0'
;
printf(
"For file %s len %d\n"
,file_md5,strlen(file_md5));
dlclose(pdlHandle);
return
0;
}
|
3.所需库文件
现在将这个文件及其官方的一个压缩包给出,这个压缩包里面有md5test2.c所需要的libleomd5.so文件。
注意MD5-SHA1.tar.bz2 的解压缩指令 tar jxvf MD5-SHA1.tar.bz2 其中的md5test.c是官方给出的测试文件,可以用于计算字符串和文件。