md5file.cpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include "precompile.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "md5.h"
  6. char *MD5_file (char *path, int md5_len)
  7. {
  8. FILE *fp = fopen (path, "rb");
  9. MD5_CTX mdContext;
  10. int bytes;
  11. unsigned char data[1024];
  12. char *file_md5;
  13. int i;
  14. if (fp == NULL)
  15. {
  16. fprintf (stderr, "fopen %s failed\n", path);
  17. return NULL;
  18. }
  19. MD5Init (&mdContext);
  20. while ((bytes = fread (data, 1, 1024, fp)) != 0)
  21. {
  22. MD5Update (&mdContext, data, bytes);
  23. }
  24. MD5Final (&mdContext);
  25. file_md5 = (char *)malloc((md5_len + 1) * sizeof(char));
  26. if(file_md5 == NULL)
  27. {
  28. fprintf(stderr, "malloc failed.\n");
  29. return NULL;
  30. }
  31. memset(file_md5, 0, (md5_len + 1));
  32. if(md5_len == 16)
  33. {
  34. for(i=4; i<12; i++)
  35. {
  36. sprintf(&file_md5[(i-4)*2], "%02x", mdContext.digest[i]);
  37. }
  38. }
  39. else if(md5_len == 32)
  40. {
  41. for(i=0; i<16; i++)
  42. {
  43. sprintf(&file_md5[i*2], "%02x", mdContext.digest[i]);
  44. }
  45. }
  46. else
  47. {
  48. fclose(fp);
  49. free(file_md5);
  50. return NULL;
  51. }
  52. fclose (fp);
  53. return file_md5;
  54. }