大文件中检索并统计二进制字符串出现的频率?


在某个大小达到三四百M的镜像文件里,存在一个离散存储的AVI类型文件。首先,找到其索引index,并且读取索引的第一个和第二个数据单元(索引数据结构见_avioldindex,索引的每个数据单元的数据结构为_avioldindex_entry )。注意,_avioldindex_entry标记着AVI文件中的一个音频或者视频流的信息。音频和视频流的结构见struct stream。
需求:以两个相邻的_avioldindex_entry为一组(索引组),在镜像中做全文检索,找到和该索引组匹配的相邻音视频流。统计这样的音视频个数,返回给被调函数。
解决思路:
提取出_avioldindex_entry中和流stream数据结构中一致的成员,也就是dwChunkId和dwSize。先在镜像中检索dwChunkId,如果找到后,再比对dwChunkId后面四个byte是否为dwSize。假设也成功,表明找到索引组第一个_avioldindex_entry对应的流。将文件的位置指针向后移动dwSize个byte(因为第2个流紧接着第一个流结束就开始了)。读取4个byte,和第二个_avioldindex_entry的dwChunkId比对,若成功,再比对紧随其中的4个byte是否和第二个_avioldindex_entry的dwSize,若一致,说明第二个流也找到了。依照此,直到检索完整个镜像文件为止。每次检索到符合到和索引组匹配的两个音视频流,就将计数器加1。函数实现见int Match(_avioldindex_entry My_IndexEntry[],FILE *fp)。
问题:
效率太低。
请教大家,如何提高匹配效率?

   
  typedef struct _avioldindex {
  
FOURCC fcc; // 必须为‘idx1’
DWORD cb; // 本数据结构的大小,不包括最初的8个字节(fcc和cb两个域)
struct _avioldindex_entry {
DWORD dwChunkId; // 表征本数据块的四字符码
DWORD dwFlags; // 说明本数据块是不是关键帧、是不是‘rec ’列表等信息
DWORD dwOffset; // 本数据块在文件中相对于“movi”List的偏移量
DWORD dwSize; // 本数据块除了块头8个Byte外的数据大小
} aIndex[]; // 这是一个数组。为每个媒体数据块都定义一个索引信息
} AVIOLDINDEX;

struct stream
{
uint32 dwChunkId; /* 标志流的类型和标号,例如00wb */
uint32 dwSize; /* 流大小 */
uint8 realdata[dwSize] /*实际的音频或者视频数据*/
};

int Match(_avioldindex_entry My_IndexEntry[],FILE *fp){
char buffer[4],sizeIndex[4];
FILE *temp_fp=fp;
int count=0;
int offset=0;
int flag;
int gap;
while(!feof(temp_fp)){
flag=-2;
fread(buffer,4,1,temp_fp);
printf("%d\n",ftell(temp_fp));

if(Compare(buffer,My_IndexEntry[0].keyword)){
flag=1;
fread(buffer,4,1,temp_fp);
gap=Trans2Data(buffer);
if(Compare(buffer,My_IndexEntry[0].size)){
fseek(fp,gap,SEEK_CUR);
fread(buffer,4,1,temp_fp);
flag=-2;
if(Compare(buffer,My_IndexEntry[1].keyword)){
flag=1;
fread(buffer,4,1,temp_fp);
gap=Trans2Data(buffer);
if(Compare(buffer,My_IndexEntry[1].size)){
count++;
}
}
}
}

if(flag==1){
fseek(temp_fp,gap,SEEK_CUR);
}
else if(flag==-2){
fseek(temp_fp,-2L,SEEK_CUR);
}

if(ftell(temp_fp)==22801032){//用于判断是否到达文件尾,文件最后一个 byte的偏移量是22801032
fgetc(temp_fp);
}

}
return count;
}



相关链接

c 编程技巧

今夜扮作大灰狼 10 years, 1 month ago

Your Answer