cxlsmd5-file

How to Calculate MD5 of xls file in C language


I have made many researches about MD5 of an xls file but my effort seems be in vain I tried to used lirary and recommendation in this link "https://stackoverflow.com/questions/27858288/calculate-md5-for-a-file-in-c-language" but , still give wrong result , can you help me ??


Solution

  • Well I used to answer the link you gave but then the question was closed. The idea is as follows. First read the file into a buffer. You can do this using following function:

    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;
    }
    

    Read the file

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

    Then you must apply MD5 on this buffer of data. You can use code similar to the one in that question (though I am not sure which library/implementation of md5 author of that question used). e.g.,

     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]);
     }
    

    Now hash should store the hash of the file, encoded in hexadecimal string. ps. Indeed that sample is incorrectly using strlen with binary file. That is why I suggested the readFile method above; that function also contains code to get file size - you can use that code to get file size and then pass the file size to md5_append method.

    ps. also don't forget to free data when you are done with it.