Advertisement
oaktree

jpg io in C (from harvard cs50 [dont cheat])

May 10th, 2016
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.21 KB | None | 0 0
  1. /**
  2.  * recover.c
  3.  *
  4.  * Computer Science 50
  5.  * Problem Set 4
  6.  *
  7.  * Recovers JPEGs from a forensic image.
  8.  */
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <stdint.h>
  12.  
  13. typedef uint8_t BYTE;
  14.  
  15. int main(void)
  16. {
  17.     FILE* cardptr = fopen("./card.raw","r");
  18.     // open up file ^, check if null
  19.     if (cardptr == NULL) {
  20.         printf("Something went wrong!\n");
  21.         return 1;
  22.     }
  23.     // init counter for file name
  24.     int counter = 0;
  25.     char name[10];
  26.  
  27.     BYTE* piece = malloc(sizeof(BYTE)*512);
  28.     if (piece == NULL) {
  29.         printf("Couldn't allocate memory for piece.\n");
  30.         return 2;
  31.     }
  32.     //read the first block from the file
  33.     while (fread(piece, sizeof(BYTE), 512, cardptr) && piece != NULL) {
  34.         // check for jpeg header
  35.         if (piece[0] == 0xff && piece[1] == 0xd8 && piece[2] == 0xff && (piece[3] >= 0xe0 && piece[3] <= 0xef)) {
  36.             // update counter and name
  37.             sprintf(name, "./%03d.jpg", counter);
  38.             counter++; //inc counter
  39.  
  40.             // open a new file with the name ###.jpg
  41.             FILE* jpeg = fopen(name, "w"); // dont forget w instead of r, silly goose!
  42.             if (jpeg == NULL) {
  43.                 printf("Failed to open file %s\n", name);
  44.                 return 2;
  45.             }
  46.             // write the block to jpeg
  47.             fwrite(piece, sizeof(BYTE), 512, jpeg); // write the jpg header to it
  48.  
  49.             // read piece again
  50.             fread(piece, sizeof(BYTE), 512, cardptr);
  51.             // while the jpg is still there, keep reading and writing 1 block at a time
  52.             // this works because each jpg starts on a new block
  53.             while (piece != NULL) {
  54.  
  55.                 // write to file
  56.                 fwrite(piece, sizeof(BYTE), 512, jpeg);
  57.                 // check for end of file, read simult
  58.                 if (fread(piece, sizeof(BYTE), 512, cardptr) < 512) {
  59.                     fclose(jpeg); // close and free everything
  60.                     free(piece); // ^
  61.                     fclose(cardptr); // ^^
  62.                     return 0;
  63.                 }
  64.                 // check if next block is header
  65.                 if (piece[0] == 0xff && piece[1] == 0xd8 && piece[2] == 0xff && (piece[3] >= 0xe0 && piece[3] <= 0xef) ) {
  66.                     fseek(cardptr, -512, SEEK_CUR); // roll back one, while loop reverses
  67.                     break; // break out of inner loop
  68.                 }
  69.             }
  70.             fclose(jpeg); // close the file
  71.         }
  72.     }
  73.     // memo frees
  74.     free(piece);
  75.  
  76.     fclose(cardptr);
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement