如何用C语言计算xls文件的MD5

时间:2015-01-12 17:43:43

标签: c xls md5-file

我对xls文件的MD5进行了很多研究,但我的努力似乎是徒劳的 我尝试在此链接中使用lirary和推荐“https://stackoverflow.com/questions/27858288/calculate-md5-for-a-file-in-c-language” 但是,仍然给出错误的结果, 你能帮助我吗 ??

3 个答案:

答案 0 :(得分:3)

xls文件的MD5与任何其他类型文件的MD5非常相同,因为它以字节为单位运行。请参见示例openssl implementation openssl / crypto / md5 / md5.c和md5test.c(代码位于git://git.openssl.org/openssl.git)。

答案 1 :(得分:3)

好吧,我曾经回答你给出的链接,但问题已经结束了。 这个想法如下。首先将文件读入缓冲区。您可以使用以下功能执行此操作:

unsigned char * readFile(const char *path)
{
    FILE * pFile;
    long lSize;
    unsigned char * buffer;
    size_t result;

    pFile = fopen (path , "rb" );
    if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

    // obtain file size:
    fseek (pFile , 0 , SEEK_END);
    lSize = ftell (pFile);
    rewind (pFile);

    // allocate memory to contain the whole file:
    buffer = malloc (sizeof(char)*lSize);
    if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

    // copy the file into the buffer:
    result = fread (buffer,1,lSize,pFile);
    if (result != lSize) {fputs ("Reading error",stderr); exit (3);}


    // terminate
    fclose (pFile);

    return buffer;
}

阅读文件

unsigned char * data = readFile("c:\\file.xls");

然后,您必须在此数据缓冲区上应用MD5。您可以使用类似的代码 在那个问题中的那个(虽然我不确定哪个库/实现 使用该问题的md5作者)。如,

 char hash[64] = {0};
 md5_byte_t digest[16] = {0};
 md5_init(&state);
 md5_append(&state, (const md5_byte_t  *)data, filesize);
 md5_finish(&state,digest);
 int i=0;      
 for(i; i<16; i++)
 {
      snprintf(hash + i*2,sizeof(hash),"%02x",digest[i]);
 }

现在hash应该存储以十六进制字符串编码的文件的哈希值。 PS。实际上,该示例错误地将strlen与二进制文件一起使用。这就是为什么我建议上面的readFile方法;该函数还包含获取文件大小的代码 - 您可以使用该代码获取文件大小,然后将文件大小传递给md5_append方法。

PS。完成后也不要忘记free data

答案 2 :(得分:2)

问题是您的示例使用strlen来确定文件大小。但是.xls格式是二进制的,因此strlen将无法正常工作。

调整函数以返回从文件中读取的总数据,它应该可以工作。

编辑。尝试类似这样的代码:

void *addr;
struct stat s;
int ret, fd;

ret = stat(filename, &s);
if (ret) {
    fprintf(stderr, "Error while stat()ing file: %m\n");
    return -1;
}

fd = open(filename, O_RDONLY);;
if (fd < 0) {
    fprintf(stderr, "Error while opening file: %m\n");
    return -1;
}

addr = mmap(NULL, s.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (addr == MAP_FAILED) {
    fprintf(stderr, "Error while mapping file: %m\n");
    close(fd);
    return -1;
}

md5_init(&state);
md5_append(&state,addr, s.st_size);
md5_finish(&state,digest);