2013-07-26 1 views
0

Я пытаюсь найти строку в данном файле (на самом деле файл является tar-файлом (обратите внимание здесь), и я открыл файл в блокноте ++ и сделал случайным образом строка из этого открытого файла), и я сохранил этот полный файл tar в буфере, и теперь я хочу найти позицию строки, которую я скопировал, используя функцию strstr в сохраненном буфере.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; 
      } 

и предположим, если у меня есть содержание смолы файл в Блокноте, как, как показано ниже, откуда я скопировал эту строку, хранящуюся в compare-

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"` 

, и если я хочу, чтобы найти этот «3_VehicleWithKinematicsAndAerodynamics_.html», используя strstr тогда я не смог найти его из-за странные данные между ними. (Потому что я думаю, что эти данные не распознается компилятором и ИУ к тому, что я не в состоянии получить доступ к файлу, который находится после странных данных) сделать более ясным видеть местоположение файла в файле смола является следующим образом-

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

я должен получить доступ к .html файла используя strstr. почему он не обращается к нему ?? есть идеи ?? *

ПОЖАЛУЙСТА ДАЙТЕ альтернативами ДОСТИЧЬ IT..I уверен, что я стараюсь не будет работать ..

+3

Я уверен, что 'strstr' остановится при первом' '0 байте, который он встречает. – arne

+0

Вы пытаетесь использовать строковые функции для необработанных двоичных данных - это, безусловно, не будет вести себя так, как вы хотите, чтобы это было –

+0

У вас есть решение этой проблемы? любая другая альтернатива? – Sss

ответ

2

строка типа AC является количество символов, прерываемых нулевого символа (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; 
} 
+0

, но мне нужно делать на Visual C++ и там не только NULL между двумя файлами есть странные данные, такие как «™ ¥ h> T¤ÇßÌþí. Cx9ð¾ "2RDF Dè Qq ‡ hðý» Ã¨Ñ (ÎïC ... ¹ \ XX 7 ¥ ~þªøý "0 ... BÄKƒ ... ßcB! Ôbí ñå & ½¾> Åk» 0¡® £ ½Æ <½ © Ø3E ... Ntâõ! ¯HB £ AYY% lL; [w?! Òt54lé $ a * TB "dŠæ¾" P) ÚOZ £ ß) \ ĪCBSBÄlxŠ½-B ". Как получить доступ ко второму файлу, который находится после этих странных данных. – Sss

+0

Вышеприведенное должно работать, чтобы найти строку, если она присутствует, независимо от остальной части данных. Чтобы найти еще одну строку дальше, начните только после последней найденной точки (и, конечно, отрегулируйте длину соответственно). Хотя я не вижу в этой строке '.png'. –

+0

Файл tar содержит данные типа 3_VehicleWithKinematicsAndAerodynamics_.000.png (его при запуске) ... Между странными данными и NULLand затем .... 3_VehicleWithKinematicsAndAerodynamics_.html (я должен загрузить данные, начиная ссюда, зная его местоположение). так что beofre я хотел сказать, что strstr может найти позицию строки до .png (просто посмотрите конец исходного файла, у файла есть расширение «.png») после этого .png есть странные данные, поэтому я не удается получить доступ к содержимому второго файла (который на самом деле является файлом .html, и я должен хранить его в буфере), у меня нет? – Sss

0

Если вы действительно хотите использовать strstr, то вам нужно избежать строку, содержащуюся в буфере с '\0'. Если вы знаете размер данных, которые были введены в буфер (скажем, sizeOfData), чем вы могли бы сделать что-то вроде этого, прежде чем использовать strstr:

buffer[sizeOfData] = '\0'; 

Внимание: если sizeOfData равно размеру буфера, то вам понадобится больший буфер или перезапишите последний символ с помощью '\0' (во втором случае вы должны вручную проверить хвост буфера, потому что символ, который вы перезаписали, может быть одним из символов последовательности, которую вы ищете).

 Смежные вопросы

  • Нет связанных вопросов^_^