From f72a0d63d5cc75af2bd203459749b58c6c433b16 Mon Sep 17 00:00:00 2001 From: bot50 Date: Wed, 13 Mar 2024 07:30:54 +0000 Subject: [PATCH] kukemuna-cs50/problems/2024/x/recover@20240313T073054.151925695Z --- recover.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 recover.c diff --git a/recover.c b/recover.c new file mode 100644 index 0000000..0a9872e --- /dev/null +++ b/recover.c @@ -0,0 +1,66 @@ +#include +#include +#include + +#define BLOCKSIZE 512 +#define NAMESIZE 8 + +int main(int argc, char *argv[]) +{ + if (argc != 2) + { + printf("Usage: ./recover FILE\n"); + return 1; + } + + FILE *card = fopen(argv[1], "r"); + if (card == NULL) + { + printf("Could not open file.\n"); + return 1; + } + + uint8_t buffer[BLOCKSIZE]; + int count = 0, first = 1; + char *filename = malloc(NAMESIZE); + FILE *jpg = NULL; + + while (fread(buffer, 1, BLOCKSIZE, card) == BLOCKSIZE) + { + // JPG header found + if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && + (buffer[3] & 0xf0) == 0xe0) + { + if (first == 1) + { + sprintf(filename, "%03i.jpg", count); + jpg = fopen(filename, "w"); + if (jpg == NULL) + { + printf("Could not open file.\n"); + return 1; + } + first = 0; + } + else + { + fclose(jpg); + sprintf(filename, "%03i.jpg", count); + jpg = fopen(filename, "w"); + if (jpg == NULL) + { + printf("Could not open file.\n"); + return 1; + } + } + count++; + } + if (first == 0) // Ignore data before first JPG header + { + fwrite(buffer, 1, BLOCKSIZE, jpg); + } + } + fclose(jpg); + fclose(card); + free(filename); +}