-
CS50 Week4: Problem Set, RecoverProgramming/CS50 2023. 7. 17. 13:50
하버드 CS50 강의 4주차 Poblem Set 과제 Recover 의 풀이 과정을 다룹니다.
파일 시스템의 작동을 이해하고, C언어로 삭제된 파일을 복구하는 문제입니다.Intro
메모리카드에서 jpg 파일을 복원하는 과제
$ ./recover card.raw
Code
#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <stdbool.h> typedef uint8_t BYTE; // Digital camera FAT file block size: 512 Bytes const int BLOCK_SIZE = 512; bool has_JPEG_header(BYTE *buffer); int main(int argc, char *argv[]) { // Ensure proper usage if (argc != 2) { printf("Usage: ./recover IMAGE\n"); return 1; } FILE *inptr = fopen(argv[1], "rb"); if (inptr == NULL) { printf("Could not read %s.\n", argv[1]); return 1; } BYTE *buffer = malloc(BLOCK_SIZE * sizeof (BYTE)); if (buffer == NULL) { printf("Could not allocate memory.\n"); return 1; } FILE *outptr = NULL; int img_count = 0; // Recover JPEGs from input file while (fread(buffer, 1, BLOCK_SIZE, inptr) == BLOCK_SIZE) { if (has_JPEG_header(buffer)) { // Close previous file, if it exists if(outptr != NULL) { fclose(outptr); } // Create new file char filename[8]; // ###.jpg\0 sprintf(filename, "%03i.jpg", img_count); outptr = fopen(filename, "wb"); if (outptr == NULL) { printf("Could not create %s.\n", filename); fclose(inptr); free(buffer); return 1; } img_count++; } if (outptr != NULL) { fwrite(buffer, 1, BLOCK_SIZE, outptr); } } free(buffer); fclose(inptr); fclose(outptr); return 0; } // Check if the first 4 bytes of the buffer are the JPEG header bool has_JPEG_header(BYTE *buffer) { if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xE0) == 0xE0) { return true; } return false; }