Advertisement
Guest User

Untitled

a guest
Feb 27th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.41 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <cs50.h>
  4.  
  5. int main(int argc, char* argv[])
  6. {
  7.  
  8. // check single argument passed, returning error if not
  9. if (argc != 2)
  10. {
  11. fprintf(stderr, "Usage : ./recover filename\n");
  12. return 1;
  13. }
  14.  
  15. char* filename = argv[1];
  16.  
  17. // open file for reading, returning error if failure
  18. FILE *inptr = fopen(filename, "r");
  19.  
  20. if (inptr == NULL)
  21. {
  22. fprintf(stderr, "Could not open %s.\n", filename);
  23. return 2;
  24. }
  25.  
  26. // iterate through bytes in file
  27. // count how many bytes found and print result
  28. int header = 0x00;
  29. int checkHeader = 0x00;
  30. int Jheader = 0x00;
  31. int JcheckHeader = 0x00;
  32. int counter = 0;
  33. int filesize = 0;
  34. int junk = 0x00;
  35.  
  36. // calculate size of file to be recovered
  37. while (!feof(inptr))
  38. {
  39. fread(&junk, 1, 1, inptr);
  40. filesize++;
  41. }
  42.  
  43. // reset file pointer to start of file
  44. rewind(inptr);
  45.  
  46. // iterate through file looking for JPEG headers
  47. for (int j = 0; j < filesize; j++)
  48. {
  49. fread(&header, 3, 1, inptr);
  50. if (header == 0xffd8ff)
  51. {
  52. fread(&checkHeader, 1, 1, inptr);
  53. if (checkHeader >= 0xe0 && checkHeader <= 0xef)
  54. {
  55. // copy file to new jpg in blocks of 512 bytes
  56. char outfile[8];
  57. sprintf(outfile, "%03i.jpg", counter);
  58. counter++;
  59. FILE *outptr = fopen(outfile, "w");
  60. if (outptr == NULL)
  61. {
  62. fprintf(stderr, "Could not create %s.\n", outfile);
  63. }
  64.  
  65. // loop through blocks of 512 bytes until JPEG header found
  66. bool isEOJ = false;
  67. fseek(inptr, -4, SEEK_CUR);
  68.  
  69. do
  70. {
  71. // read 512 bytes into buffer
  72. int buffer[512];
  73. j += 512;
  74. for (int i = 0; i < 512; i++)
  75. {
  76. fread(&buffer[i], 1, 1, inptr);
  77. }
  78.  
  79. // write buffer to file
  80. for (int i = 0; i < 512; i++)
  81. {
  82. fwrite(&buffer[i], 1, 1, outptr);
  83. }
  84.  
  85. // check if start of next block is JPEG header
  86.  
  87. fread(&Jheader, 3, 1, inptr);
  88. if (Jheader == 0xffd8ff)
  89. {
  90. fread(&JcheckHeader, 1, 1, inptr);
  91. if (JcheckHeader >= 0xe0 && JcheckHeader <= 0xef)
  92. {
  93. fseek(inptr, -4, SEEK_CUR);
  94. isEOJ = true;
  95. } else
  96. {
  97. fseek(inptr, -4, SEEK_CUR);
  98. }
  99. } else
  100. {
  101. fseek (inptr, -3, SEEK_CUR);
  102. }
  103.  
  104. if (j >= filesize)
  105. {
  106. isEOJ = true;
  107. }
  108.  
  109. } while (!isEOJ);
  110.  
  111. fclose(outptr);
  112.  
  113. } else
  114. {
  115. fseek(inptr, -1, SEEK_CUR);
  116. }
  117. }
  118. fseek(inptr, -2, SEEK_CUR);
  119. }
  120.  
  121. return 0;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement