strstr无法以八进制格式搜索数据内的字符串

时间:2013-07-26 13:26:38

标签: c++ tar strstr

我正在尝试在给定文件中找到一个字符串(实际上该文件是tar文件(请注意这里)并且我在记事本++中打开文件并从该打开的文件中随机取一个字符串)并且我存储了完整的tar文件在缓冲区中,现在我想找到我在存储缓冲区中使用strstr函数复制的字符串的位置。

要做的代码是这(绝对正确) -

char *compare= "_.png"; //suppose this is the copied string
//which is to be find out in buffer using strstr
            char * StartPosition;
            StartPosition = strstr (buffer,compare);
            __int64 count=0; 
            MessageBox(m_hwndPreview,L"before the while loop",L"BTN WND6",MB_ICONINFORMATION);
            while (StartPosition!=NULL)
            {
                MessageBox(m_hwndPreview,L"hurr inside the while loop",L"BTN WND6",MB_ICONINFORMATION);
                MessageBoxA(m_hwndPreview,strerror(errno),"BTN WND4", MB_ICONINFORMATION);
                count=StartPosition-buffer+1;
                return 0;
            }

并假设我在记事本中有tar文件的内容,如下所示,我复制了比较中存储的这个字符串 -

3_VehicleWithKinematicsAndAerodynamics_.000.png  IHDR (here is some strange data which can't be copied and also there are lot of NULL but we have to find out the position of "_.png" so not so difficult in this case ).

问题是我的代码工作正常,直到我在.png之前存储数据然后我能够使用strstr找到它的位置问题是当我试图找出出现在

之后的字符串位置
`3_VehicleWithKinematicsAndAerodynamics_.000.png  IHDR ...suppose here we have strange data (which is data block if we see the tar parser)...after this we have another file  like..."3_VehicleWithKinematicsAndAerodynamics_.html"`

如果我想使用strstr找到这个“3_VehicleWithKinematicsAndAerodynamics_.html”,那么由于它们之间的奇怪数据,我无法找到它。(因为我认为那些数据不被编译器识别,而是dut到那个我无法访问位于奇怪数据之后的文件) 更清楚地看到tar文件中文件的位置如下 -

3_VehicleWithKinematicsAndAerodynamics_.000.png  IHDR ............(its data blocl-which is strange contents if you open in tar file)....3_VehicleWithKinematicsAndAerodynamics_.000.html

我必须使用strstr访问.html文件。为什么它不访问它?有任何想法吗 ?? *

请给出实现它的替代方案......我确信我尝试的东西不起作用..

2 个答案:

答案 0 :(得分:2)

C样式字符串是由零字符(NUL字符 - 值零,而不是字符'0')终止的字符数。这意味着strstr会在遇到这样一个字节时立即停止。

一个非常合理的解决方案是简单地编写一个函数,根据它的长度搜索二进制数据,而不是“终止字符”。

这样的事情(这仍假设str是C风格的字符串):

 char *find_str_in_data(const char *str, const char *data, int length)
 {
    int pos = 0;
    int slen = strlen(str);
    while(pos < length-slen)
    {
       int i = 0;
       while(i < slen && str[i] = data[pos+i])
       {
           i++;
       }
       if (i == slen)
          return data + pos;
   }
   return NULL;
}

答案 1 :(得分:0)

如果您确实想使用strstr,则需要使用'\0' 转义缓冲区中包含的字符串。如果您知道放入缓冲区的数据大小(比方说,sizeOfData),那么在使用strstr之前,您可能会这样做:

buffer[sizeOfData] = '\0';

警告:如果sizeOfData等于缓冲区的大小,那么您将需要更大的缓冲区或用'\0'覆盖最后一个字符(在第二种情况下)你应该手动检查缓冲区尾部,因为你覆盖的字符可能是你正在寻找的序列之一。