Ктонибудь знает хорошие алгоритмы для поиска в двоичном файле.
Файлы видео MPEG-2 просто огромние. Самие скромние в несколько GB
а в них нужно найти например количество фреймов. т.. нужно проти всего
монстра и посчитать колличество picture headers. интересно как все ето
можно оптимизировать
Re: Поиск в двоичном файле
От:
Аноним
Дата:
19.12.01 07:44
Оценка:
Здравствуйте rzhitn, Вы писали:
R>Ктонибудь знает хорошие алгоритмы для поиска в двоичном файле. R>Файлы видео MPEG-2 просто огромние. Самие скромние в несколько GB R>а в них нужно найти например количество фреймов. т.. нужно проти всего R>монстра и посчитать колличество picture headers. интересно как все ето R>можно оптимизировать
Извини, не знаю формат MPEG-2, поэтому предложение может не стрельнуть, так вот если фреймы одинаковой длины, то можно позиционироваться на нужном по его номеру, как по индексу в массиве. А если нужно найти количество фреймов, просто подели размер файла на размер фрейма.
Здравствуйте Аноним, Вы писали:
А>Извини, не знаю формат MPEG-2, поэтому предложение может не стрельнуть, так вот если фреймы одинаковой длины, то можно позиционироваться на нужном по его номеру, как по индексу в массиве. А если нужно найти количество фреймов, просто подели размер файла на размер фрейма.
К сожалению не подходит. Все фреймы разного размера и у каждого есть заголовок. Вот мне и надо считать все эти зааголовки
Здравствуйте rzhitn, Вы писали:
А>>Извини, не знаю формат MPEG-2, поэтому предложение может не стрельнуть, так вот если фреймы одинаковой длины, то можно позиционироваться на нужном по его номеру, как по индексу в массиве. А если нужно найти количество фреймов, просто подели размер файла на размер фрейма.
R>К сожалению не подходит. Все фреймы разного размера и у каждого есть заголовок. Вот мне и надо считать все эти зааголовки
Тогда просто ищи оптимальный алгоритм поиска, где-то у меня есть один, чем больше кусок "паттерна", тем быстрее ищет...
Здравствуйте TSS, Вы писали:
R>>К сожалению не подходит. Все фреймы разного размера и у каждого есть заголовок. Вот мне и надо считать все эти зааголовки
TSS>Тогда просто ищи оптимальный алгоритм поиска, где-то у меня есть один, чем больше кусок "паттерна", тем быстрее ищет...
А разве эти фреймы не должны быть связаны в какой-нибудь список?
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте IT, Вы писали:
IT>А разве эти фреймы не должны быть связаны в какой-нибудь список?
Фреймы в список не связаны. они идут группа за группой а в гуппе они
делятся на I,B,P фрэймы. Не буду утомлять подробностями MPEG2 сжаатия.
Здравствуйте 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: дело твое живет и процветает ...
Здравствуйте 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: дело твое живет и процветает ...
Здравствуйте TSS, Вы писали:
R>>Если можно, кинь на e-mail етот алгоритм а то как-то изобретать велосипед не хочется
TSS>Зачем на мыло. Вот он: TSS>--- cut --- TSS>--- cut ---
TSS>Ограничения: Паттерн не более 256 байт. Заголовки фреймов MPEG-2, надеюсь, прикрутишь сам...
TSS>P.S. Кста, в свое время мне этот код подкинул Alex Fedotov...
Oh, really? Но копирайт-то точно не мой, я такого придумать не мог. Надо посмотреть 3-х томник Кнута, это скорее всего оттуда содрано.
Здравствуйте 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;
}
// не пытайтесь токмо делать как ниже - не выведется ничего хорошего по понятным причинам - файл то не
// текстовый и сожержит концы строк
cout << str_data.c_str() << endl;
Здравствуйте Alex Fedotov, Вы писали:
TSS>>P.S. Кста, в свое время мне этот код подкинул Alex Fedotov...
AF>Oh, really? Но копирайт-то точно не мой, я такого придумать не мог. Надо посмотреть 3-х томник Кнута, это скорее всего оттуда содрано.