Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * recover.c
- *
- * Computer Science 50
- * Problem Set 4
- *
- * Recovers JPEGs from a forensic image.
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <cs50.h>
- #include <math.h>
- #include <stdint.h>
- FILE* inptr;
- void make_jpg (FILE* new_jpg)
- {
- uint8_t buffer[512];
- fread(&buffer, 512, 1, inptr);
- if((buffer[0]==0xff && buffer[1]==0xd8 && buffer[2]==0xff && buffer[3]==0xe1) || (buffer[0]==0xff && buffer[1]==0xd8 && buffer[2]==0xff && buffer[3]==0xe0))
- {
- fseek(inptr, -512, SEEK_CUR);
- }else if(feof(inptr)){
- }else{
- fwrite(&buffer, 512, 1, new_jpg);
- make_jpg(new_jpg);
- }
- };
- int main(void)
- {
- char* infile = "card.raw";
- inptr = fopen(infile, "r");
- if (inptr == NULL)
- {
- printf("Could not open %s.\n", infile);
- return 2;
- }
- // Move inptr to first jpg filled block
- uint8_t check[4];
- fread(&check, 4, 1, inptr);
- bool look = true;
- while (look)
- {
- if((check[0]==0xff && check[1]==0xd8 && check[2]==0xff && check[3]==0xe1) || (check[0]==0xff && check[1]==0xd8 && check[2]==0xff && check[3]==0xe0))
- {
- look = false;
- }else{
- fseek(inptr, 508, SEEK_CUR);
- fread(&check, 4, 1, inptr);
- }
- }
- fseek(inptr, -4, SEEK_CUR);
- // set counter for jpg files
- int i = 0;
- // keep creating jpg files until eof
- while (!feof(inptr))
- {
- char str[7];
- sprintf(str, "%03d.jpg", i);
- FILE* outptr;
- char* outfile = str;
- outptr = fopen(outfile, "w");
- //write the first block
- uint8_t buffer[512];
- fread(&buffer, 512, 1, inptr);
- fwrite(&buffer, 512, 1, outptr);
- //finish remaining jpg if any
- make_jpg(outptr);
- //close
- fclose(outptr);
- i++;
- }
- fclose(inptr);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement