I'm making a program in C that tries to recover any deleted JPGs.
My overall approach is to load a block size (on FAT 512 bytes) of the file into memory to see if the JPG signature is present in the first four bytes (it's guaranteed to be in those bytes).
If the signature is present, I'll onward write chunks of 512 bytes to the file until I see another JPG etc.
Here's my code so far:
#include <stdio.h>
#include <stdlib.h>
#include "jpg.h" /*set uint8_t to  BYTE */  
int main(int argc, char* argv[])
{
    // Opens the rFile
    FILE* rFile = fopen("card.raw", "r");
    // Checks for errors in opening rFile and terminates program
    if (rFile == NULL)
    {
        printf("Error opening rFile");
        return 0;
    }
    // Sets the blocksize (depends on the filesystem)
    int blockSize = 512;
    // allocates space for buffer on heap
    char* buf = malloc(blockSize);
    // image counter
    int icount = 0;
    // write file
    FILE* wFile = NULL; 
    // iterates through content of rFile in size buf
    while (fread(&buf, blockSize, 1, rFile))
    {
        // Check if the first four bytes are JPG signature
        if (buf[0] == 0xff && buf[1] == 0xd8 && buf[2] == 0xff
            && (buf[3] == 0xe0 || buf[3] == 0xe1))
        {
            // Close the file, if opened
            if (wFile != NULL)
                fclose(wFile);
            // Determine name of new file
            char filename[8];
            sprintf(filename, "%03d.jpg", icount);
            // Open new JPG for Writing
            wFile = fopen(filename, "w");
            // Iterates the filename icount
            icount++; 
        }
        // Write blocksize to file
        if (wFile != NULL)
            fwrite(buf, blockSize, 1, wFile);
    }
    // Close the current file if exists 
    if (wFile != NULL)
        fclose(wFile);
    // Frees buffer on heap
    free(buf);
    // Close read file
    fclose (rFile);
}
However when compiling, the compiler says it can't compare the buf[0-3] to the constants which are the signature bytes of JPGs
if (buf[0] == 0xff && buf[1] == 0xd8 && buf[2] == 0xff && (buf[3] == 0xe0 || buf[3] == 0xe1))
{
    doStuff();
{
The error I get is:
clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wshadow    recover.c  -lcs50 -lm -o recover
recover.c:44:20: error: comparison of constant 255 with expression of type 'char' is always false [-Werror,-Wtautological-constant-out-of-range-compare]
        if (buf[0] == 0xff && buf[1] == 0xd8 && buf[2] == 0xff
            ~~~~~~ ^  ~~~~
recover.c:44:38: error: comparison of constant 216 with expression of type 'char' is always false [-Werror,-Wtautological-constant-out-of-range-compare]
        if (buf[0] == 0xff && buf[1] == 0xd8 && buf[2] == 0xff
                              ~~~~~~ ^  ~~~~
recover.c:44:56: error: comparison of constant 255 with expression of type 'char' is always false [-Werror,-Wtautological-constant-out-of-range-compare]
        if (buf[0] == 0xff && buf[1] == 0xd8 && buf[2] == 0xff
                                                ~~~~~~ ^  ~~~~
recover.c:45:24: error: comparison of constant 224 with expression of type 'char' is always false [-Werror,-Wtautological-constant-out-of-range-compare]
            && (buf[3] == 0xe0 || buf[3] == 0xe1))
                ~~~~~~ ^  ~~~~
recover.c:45:42: error: comparison of constant 225 with expression of type 'char' is always false [-Werror,-Wtautological-constant-out-of-range-compare]
            && (buf[3] == 0xe0 || buf[3] == 0xe1))
                                  ~~~~~~ ^  ~~~~
5 errors generated.
make: *** [recover] Error 1
Thank you for your help it works now. ( I changed the buffer to an unsigned char and fread(buf...) instead of fread(&buf...).
All this help has given the rise of a few new questions if any guru has the time to answer them I'd be grateful.
I know these are likely stupid question, but nonetheless valuable to me.
char is signed on your platform, and 0xe0 does not fit into a signed char.
Change buf's type to unsigned char.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With