Re[5]: Поиск в двоичном файле
От: TSS Россия http://www.sdl.ru
Дата: 19.12.01 15:54
Оценка: 1 (1)
Здравствуйте rzhitn, Вы писали:

R>Здравствуйте TSS, Вы писали:


TSS>>Тогда просто ищи оптимальный алгоритм поиска, где-то у меня есть один, чем больше кусок "паттерна", тем быстрее ищет...


R>Если можно, кинь на e-mail етот алгоритм а то как-то изобретать велосипед не хочется


Зачем на мыло. Вот он:
--- cut ---
/////////////////////////////////////////////////////////////////////////////
// QSearch ()
// Where = QSearch (pWhere, cbWhere, pWhat, cbWhat)
//
LPBYTE QSearch (LPBYTE s, INT n, LPBYTE p, INT m)
{
  _ASSERTE (m < 256);

  if (m > n)
    return NULL;

  BYTE d[256]; memset(d, m, 256);
  for (int j = 0; j < m - 1; j++)
    d[p[j]] = m - j - 1;

  for (int i = m; i < n; i += d[s[i-1]])
  {
    int j = m, k = i;
    do
    {
      if (--j < 0)
        return (s + k);
      --k;
    }
    while (p[j] == s[k]);

    _ASSERTE(j >= 0);
  }

  return (NULL);
  
} // QSearch

--- cut ---

Ограничения: Паттерн не более 256 байт. Заголовки фреймов MPEG-2, надеюсь, прикрутишь сам...

P.S. Кста, в свое время мне этот код подкинул Alex Fedotov...
P.P.S. 2Alex Fedotov: дело твое живет и процветает ...
Signed, [TSS] /SDL/
Поиск в двоичном файле
От: rzhitn  
Дата: 18.12.01 22:29
Оценка:
Ктонибудь знает хорошие алгоритмы для поиска в двоичном файле.
Файлы видео MPEG-2 просто огромние. Самие скромние в несколько GB
а в них нужно найти например количество фреймов. т.. нужно проти всего
монстра и посчитать колличество picture headers. интересно как все ето
можно оптимизировать
Re: Поиск в двоичном файле
От: Аноним  
Дата: 19.12.01 07:44
Оценка:
Здравствуйте rzhitn, Вы писали:

R>Ктонибудь знает хорошие алгоритмы для поиска в двоичном файле.

R>Файлы видео MPEG-2 просто огромние. Самие скромние в несколько GB
R>а в них нужно найти например количество фреймов. т.. нужно проти всего
R>монстра и посчитать колличество picture headers. интересно как все ето
R>можно оптимизировать

Извини, не знаю формат MPEG-2, поэтому предложение может не стрельнуть, так вот если фреймы одинаковой длины, то можно позиционироваться на нужном по его номеру, как по индексу в массиве. А если нужно найти количество фреймов, просто подели размер файла на размер фрейма.

Best regards,
Sky
Re[2]: Поиск в двоичном файле
От: rzhitn  
Дата: 19.12.01 15:12
Оценка:
Здравствуйте Аноним, Вы писали:

А>Извини, не знаю формат MPEG-2, поэтому предложение может не стрельнуть, так вот если фреймы одинаковой длины, то можно позиционироваться на нужном по его номеру, как по индексу в массиве. А если нужно найти количество фреймов, просто подели размер файла на размер фрейма.


К сожалению не подходит. Все фреймы разного размера и у каждого есть заголовок. Вот мне и надо считать все эти зааголовки
Re[3]: Поиск в двоичном файле
От: TSS Россия http://www.sdl.ru
Дата: 19.12.01 15:37
Оценка:
Здравствуйте rzhitn, Вы писали:

А>>Извини, не знаю формат MPEG-2, поэтому предложение может не стрельнуть, так вот если фреймы одинаковой длины, то можно позиционироваться на нужном по его номеру, как по индексу в массиве. А если нужно найти количество фреймов, просто подели размер файла на размер фрейма.


R>К сожалению не подходит. Все фреймы разного размера и у каждого есть заголовок. Вот мне и надо считать все эти зааголовки


Тогда просто ищи оптимальный алгоритм поиска, где-то у меня есть один, чем больше кусок "паттерна", тем быстрее ищет...
Signed, [TSS] /SDL/
Re[4]: Поиск в двоичном файле
От: IT Россия linq2db.com
Дата: 19.12.01 15:43
Оценка:
Здравствуйте TSS, Вы писали:

R>>К сожалению не подходит. Все фреймы разного размера и у каждого есть заголовок. Вот мне и надо считать все эти зааголовки


TSS>Тогда просто ищи оптимальный алгоритм поиска, где-то у меня есть один, чем больше кусок "паттерна", тем быстрее ищет...


А разве эти фреймы не должны быть связаны в какой-нибудь список?
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Поиск в двоичном файле
От: rzhitn  
Дата: 19.12.01 15:49
Оценка:
Здравствуйте TSS, Вы писали:


TSS>Тогда просто ищи оптимальный алгоритм поиска, где-то у меня есть один, чем больше кусок "паттерна", тем быстрее ищет...


Если можно, кинь на e-mail етот алгоритм а то как-то изобретать велосипед не хочется
Re[5]: Поиск в двоичном файле
От: rzhitn  
Дата: 19.12.01 15:52
Оценка:
Здравствуйте IT, Вы писали:

IT>А разве эти фреймы не должны быть связаны в какой-нибудь список?

Фреймы в список не связаны. они идут группа за группой а в гуппе они
делятся на I,B,P фрэймы. Не буду утомлять подробностями MPEG2 сжаатия.
Re[6]: Поиск в двоичном файле
От: rzhitn  
Дата: 21.12.01 16:40
Оценка:
Спасибо за ответ. Очень интересный алгоритм.

Здравствуйте TSS, Вы писали:

TSS>Здравствуйте rzhitn, Вы писали:


R>>Здравствуйте TSS, Вы писали:


TSS>>>Тогда просто ищи оптимальный алгоритм поиска, где-то у меня есть один, чем больше кусок "паттерна", тем быстрее ищет...


R>>Если можно, кинь на e-mail етот алгоритм а то как-то изобретать велосипед не хочется


TSS>Зачем на мыло. Вот он:

TSS>--- cut ---
TSS>
TSS>/////////////////////////////////////////////////////////////////////////////
TSS>// QSearch ()
TSS>// Where = QSearch (pWhere, cbWhere, pWhat, cbWhat)
TSS>//
TSS>LPBYTE QSearch (LPBYTE s, INT n, LPBYTE p, INT m)
TSS>{
TSS>  _ASSERTE (m < 256);

TSS>  if (m > n)
TSS>    return NULL;

TSS>  BYTE d[256]; memset(d, m, 256);
TSS>  for (int j = 0; j < m - 1; j++)
TSS>    d[p[j]] = m - j - 1;

TSS>  for (int i = m; i < n; i += d[s[i-1]])
TSS>  {
TSS>    int j = m, k = i;
TSS>    do
TSS>    {
TSS>      if (--j < 0)
TSS>        return (s + k);
TSS>      --k;
TSS>    }
TSS>    while (p[j] == s[k]);

TSS>    _ASSERTE(j >= 0);
TSS>  }

TSS>  return (NULL);
TSS>  
TSS>} // QSearch
TSS>

TSS>--- cut ---

TSS>Ограничения: Паттерн не более 256 байт. Заголовки фреймов MPEG-2, надеюсь, прикрутишь сам...


TSS>P.S. Кста, в свое время мне этот код подкинул Alex Fedotov...

TSS>P.P.S. 2Alex Fedotov: дело твое живет и процветает ...
Re[6]: Поиск в двоичном файле
От: Alex Fedotov США  
Дата: 21.12.01 17:16
Оценка:
Здравствуйте TSS, Вы писали:

R>>Если можно, кинь на e-mail етот алгоритм а то как-то изобретать велосипед не хочется


TSS>Зачем на мыло. Вот он:

TSS>--- cut ---
TSS>--- cut ---

TSS>Ограничения: Паттерн не более 256 байт. Заголовки фреймов MPEG-2, надеюсь, прикрутишь сам...


TSS>P.S. Кста, в свое время мне этот код подкинул Alex Fedotov...


Oh, really? Но копирайт-то точно не мой, я такого придумать не мог. Надо посмотреть 3-х томник Кнута, это скорее всего оттуда содрано.
-- Alex Fedotov
Re: Поиск в двоичном файле
От: Юнусов Булат Россия  
Дата: 21.12.01 21:45
Оценка:
Здравствуйте rzhitn, Вы писали:

R>Ктонибудь знает хорошие алгоритмы для поиска в двоичном файле.

R>Файлы видео MPEG-2 просто огромние. Самие скромние в несколько GB
R>а в них нужно найти например количество фреймов. т.. нужно проти всего
R>монстра и посчитать колличество picture headers. интересно как все ето
R>можно оптимизировать

У нас стояла одна буржуйская установка, коя сохраняла инфу в бинарном виде (и в своем формате — мне неизвестном до сих пор), но кое какие куски из ее файлов содержали текстовые осмысленные куски. Короче пришлось делать конвертилку.

Фишка в том что весь файл упихивается в std::string а затем делаем обычный же find
Только сразу скажу — файлы были не гигабайтные!
Примерно так это росло:

#include <string>
#include <fstream>
#include <iostream>
#include <sstream>

using namespace std;

int main(int argc, char* argv[])
{
    ifstream in("lkc.bin", ios::in|ios::binary); // тестовый файл
    ostringstream out;  
    out << in.rdbuf();
    string str_data = out.str(); // вот и все - считали весь файл в строку

    cout << str_data.size() << endl; // размерчик

    
    // Ищем до победного конца
    string str_what_to_search = "CONE_RESPONSE";
    int pos=0;
    while(true)
    {
        pos = str_data.find(str_what_to_search, pos);
        if(pos == -1)
            break;
        else
        {
            string s = str_data.substr(pos, str_what_to_search.size());
            cout << s.c_str() << endl;
            ++pos;
        }
    }
    return 0;
}
Re[2]: Поиск в двоичном файле
От: Юнусов Булат Россия  
Дата: 21.12.01 21:50
Оценка:
       // не пытайтесь токмо делать как ниже - не выведется ничего хорошего по понятным причинам - файл то не 
       // текстовый и сожержит концы строк
       cout << str_data.c_str() << endl;
Re[7]: Поиск в двоичном файле
От: TSS Россия http://www.sdl.ru
Дата: 25.12.01 07:51
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

TSS>>P.S. Кста, в свое время мне этот код подкинул Alex Fedotov...


AF>Oh, really? Но копирайт-то точно не мой, я такого придумать не мог. Надо посмотреть 3-х томник Кнута, это скорее всего оттуда содрано.


Я сказал "подкинул", а не наваял
Signed, [TSS] /SDL/
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.