TheDude1256
TheDude1256

Reputation: 3

How can I properly print the bytes of a JPEG file? - CS50 PSET3 Recover

I am trying to use fread on a file containing multiple JPEGs and write the JPEGs into new files, but before I can do that I need to properly look through the file and look for the JPEGs based on their first bytes based on the if statement at the bottom of the code below.

I have not been able to get into the if statement, and have been trying to print out the bytes, but I have been running into issues in printing.

I'm looking to print just the 0 byte of the buffer, but my output is looking like this: 711151a6 cec117f0 7603c9a9 73599166

I'm very new to C and fread, and any help would be appreciated!

Code:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    // Check for 2 arguments, the name of the program and the file being read
    if (argc != 2)
    {
        printf("Usage: ./recover image\n");
        return 1;
    }
    else
    {
        //Open the file
        FILE * fp;
        fp = fopen(argv[1], "r");

        //Get file length
        fseek(fp, 0, SEEK_END);
        int f_length = ftell(fp);
        fseek(fp, 0, SEEK_SET);

        // If not file is found then exit
        if(fp == NULL)
        {
            printf("File not found\n");
            return 2;
        }

        // Allocate buffer for fread function
        int *buffer = (int*)malloc(f_length);
        if (buffer == NULL)
        {
            printf("Buffer is null\n");
            return 1;
        }

        // Read thorugh the file
        while(fread(buffer, 512, 1, fp) == 1)
        {


            for (int i = 0; i < 1; i++)
            {
                printf("%x\n", buffer[i]);
            }

            if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
            {
                printf("Found a jpg\n");
            }
        }

        // Exit the program
        return 0;
    }
}

Upvotes: 0

Views: 369

Answers (1)

kaylum
kaylum

Reputation: 14044

int *buffer is not correct because the intention is to deal with bytes and not ints. If int * is used, then for example, buffer[0] will be the first 4 bytes and not the first byte as intended. Change that to unsigned char *buffer.

So explicitly, that line should be the following (including removing the unnecessary cast):

unsigned char *buffer = malloc(f_length);

Upvotes: 1

Related Questions