在C中搜索二进制模式(读取缓冲的二进制文件)

Sup*_*vah 2 c binary design-patterns match buffered

嘿.我正在尝试编写一个小程序,它将在最后一次出现"0xFF 0xC0 0x00 0x11"后读取后面的四个字节,这些字节可以很容易地转换为二进制或十进制.目的是最后一次出现该六角形图案后的2-5个字节表示JPEG文件的宽度和高度.

#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;
 }
Run Code Online (Sandbox Code Playgroud)

问题是我不知道如何递归地从缓冲的内存中读取并使用最近读取的变量作为int来与我的二进制/十六进制/十进制进行比较.

我该怎么做呢?

Kei*_*all 9

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;
}
Run Code Online (Sandbox Code Playgroud)

如果last_needle不为null,则可以打印出来last_needle+4......

  • `memmem()`函数不是由POSIX标准化的,但可以在Linux和AIX上使用,但不能在MacOS X(10.5)或Solaris 10上使用. (2认同)