Search for Binary Pattern in C (Read buffered binary file)

14,766

Solution 1

byte needle[4] = {0xff, 0xc0, 0x00, 0x11};
byte *last_needle = NULL;
while (true) {
  byte *p = memmem(buffer, lSize, needle, 4); 
  if (!p) break;
  last_needle = p;
  lSize -= (p + 4) - buffer;
  buffer = p + 4;
}

If last_needle is not null, you can print out last_needle+4...

Solution 2

instead of reading the entire file into memory, I would use a bit of a state machine. My C is a bit rusty, but:

char searchChars[] = {0xFF,0xC0,0x00,0x11};
char lastBytes[5];
int pos = 0; int curSearch = 0;
while(pos <= lSize) {
    curChar = getc(pfile); pos++;            /*readone char*/

    if(curChar == searchChars[curSearch]) { /* found a match */
        curSearch++;                        /* search for next char */
        if(curSearch > 3) {                 /* found the whole string! */
            curSearch = 0;                  /* start searching again */
            read = fread(lastBytes,1,5,pfile); /* read 5 bytes */
            pos += read;                      /* advance position by how much we read */
        }
    } else { /* didn't find a match */
        curSearch = 0;                     /* go back to searching for first char */
    }
 }

at the end, you're left with 5 bytes in lastBytes which are the five bytes right after the last time you find searchChars

Share:
14,766
user3607601
Author by

user3607601

Cool cat!

Updated on June 04, 2022

Comments

  • user3607601
    user3607601 almost 2 years

    Hey there. I'm trying to write a small program that will read the four following bytes after the last occurrence of "0xFF 0xC0 0x00 0x11" which can be converted easily to binary or decimal. The purpose is that the 2-5 bytes following the last occurrence of that hex pattern represent the width and height of a JPEG file.

    #include <stdio.h>
    
     int main () {
      FILE * pFile;
      long lSize;
      char * buffer;
      size_t result;
    
      pFile = fopen ( "pano8sample.jpg" , "rb" );
      if(pFile==NULL){
       fputs ("File error",stderr);
       exit (1);
      }
    
      fseek (pFile , 0 , SEEK_END);
      lSize = ftell (pFile);
      rewind (pFile);
    
      printf("\n\nFile is %d bytes big\n\n", lSize);
    
      buffer = (char*) malloc (sizeof(char)*lSize);
      if(buffer == NULL){
       fputs("Memory error",stderr);
       exit (2);
      }
    
      result = fread (buffer,1,lSize,pFile);
      if(result != lSize){
       fputs("Reading error",stderr);
       exit (3);
      }
    
      //0xFF 0xC0 0x00 0x11 (0x08)
    
      //Logic to check for hex/binary/dec
    
      fclose (pFile);
      free (buffer);
      return 0;
     }
    

    The problem is I don't know how to read from the buffered memory recursively and use the most recently read variable as an int to compare against my binary/hex/dec.

    How do I do this?