C Programer  - 讨论区

标题:APR md5 模块编程范例

2014年01月13日 星期一 10:48

APR的md5模块提供了计算MD5值的基本方法。针对小文件,可以采用简单的One Step方式(apr_md5),针对大文件,可以采取分步方式。

编程示例如下:

#include <stdio.h>
#include <apr.h>
#include <apr_pools.h>
#include <apr_errno.h>
#include <apr_strings.h>
#include <apr_md5.h>
#include <apr_file_io.h>

void apr_err(const char *s, apr_status_t rv)
{
    char buf[120];
    fprintf(stderr, "%s: %s (%d)\n", s, 
         apr_strerror(rv, buf, sizeof buf), rv);
}

int main(int argc,char **argv) {
    apr_initialize();
    apr_pool_t *pool;
    apr_pool_create(&pool,NULL);
    apr_status_t st;

    char *filename;
    if(argc > 1) {
        filename=argv[1];
    } else {
        filename="apr_md5.c";
    }

    apr_md5_ctx_t md5;
    apr_md5_init(&md5);

    apr_file_t *file;
    st=apr_file_open(&file,filename,
          APR_READ,APR_REG,pool);
    if(st != APR_SUCCESS) {
        apr_err("apr_file_open()",st);
        return st;
    }
    apr_size_t n=1024;
    char *buf=apr_pcalloc(pool,n);
    while(APR_EOF != apr_file_eof(file)) {
        n=1024;
        st=apr_file_read(file,buf,&n);
        apr_md5_update(&md5,buf,n);
    }
    unsigned char result[APR_MD5_DIGESTSIZE];
    apr_md5_final(result,&md5);
    
    for(int i=0;i<APR_MD5_DIGESTSIZE;i++) {
        printf("%02x",result[i]);   
    }
    printf("\n");

    apr_off_t size=0;
    apr_file_seek(file,APR_END,&size);
    char *content=apr_pcalloc(pool,size);

    apr_off_t nsize=0;
    apr_file_seek(file,APR_SET,&nsize);

    apr_file_read(file,content,&size);
    apr_md5(result,content,size);
    for(int i=0;i<APR_MD5_DIGESTSIZE;i++) {
        printf("%02x",result[i]);   
    }
    printf("\n");
    
    apr_file_close(file); 

    apr_pool_destroy(pool);
    apr_terminate();
    return 0;
}

 

参考资料:

http://apr.apache.org/docs/apr-util/1.3/group___a_p_r___m_d5.html
http://apr.apache.org/docs/apr/1.3/group__apr__file__io.html

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号