pset 3 - recovery - код выводит только одно изображение и отлаживается 50 выходов - PullRequest
1 голос
/ 06 июня 2019

Я следовал псевдокоду восстановления pset 3, и мой код выводит только одно изображение, и отладчик (debug50) закрывается после 4-го цикла в строке number = fread(buffer, 1, 512, file);.

Я проверил шестнадцатеричные значения моего выводаJPEG и оказывается, что это также неверно по сравнению с необработанным файлом.Я могу различить изображение, но некоторые шестнадцатеричные числа отклоняются небольшими числами. Я

// open card file 
FILE *file = fopen(argv[1], "r");
if (file == NULL)
{
    fprintf(stderr, "Couldn't open %s", argv[1]);
    return 2;
}

// buffer
unsigned char *buffer = malloc(513);
buffer[512] = 0x00;

// number
int number = 512;

// bool
int jpegFound = 0;

// jpeg number
int jpegNum = 0;

// jpeg name  
char *jpegName = malloc(8);
jpegName[7] = 0x00; 

// jpeg file pointer
FILE *jpegPtr;

// iterate through all the blocks of the card
while (1)
{
    // read 512 bytes into a buffer
    number = fread(buffer, 1, 512, file);

    // break out of the loop if its the EOF
    if (number != 512)
    {
        break;
    }

    // check whether its the start of a new jpeg
    if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
    {
        // have we already found a jpeg?
        if (jpegFound == 1)
        {
            // close previous jpeg file
            fclose(jpegPtr);

            // store the jpegName in a string
            sprintf(jpegName, "%03i.jpg", jpegNum);

            // open a new file with the stored jpeg name
            jpegPtr = fopen(jpegName, "w");

        }
        else
        {
            // we found a jpeg finally
            jpegFound = 1;

            // store the jpeg Name in a string
            sprintf(jpegName, "%03i.jpg", jpegNum);

            // open a new file with the stored jpeg name
            jpegPtr = fopen(jpegName, "w");
        }

        // write buffer to the jpeg
        fwrite(buffer, 1, 512, jpegPtr);
    }
    else
    {
        if (jpegFound == 1)
        {
            // these bytes are part of the previous jpeg
            fwrite(buffer, 1, 512, jpegPtr);
        }
        else
        {
            // this means that these bytes can be discarded
        }
    }
}

// close any remaining files
fclose(jpegPtr);

// free the memory we used in malloc
free(buffer);
free(jpegName);

// return 0
return 0;

ожидаемый результат ./recover card.raw будет много изображений, но получил только одно изображение, которое выглядит хорошо, но некоторые из его шестнадцатеричных значенийслегка отклоняются.

1 Ответ

0 голосов
/ 07 июня 2019

Я исправил это.Я не увеличивал jpegNum, также, что касается debug50, я до сих пор не знаю, что вызывает его прекращение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...