Название: Поиск по файлу Отправлено: olympian от Сентябрь 26, 2010, 14:03 Здравствуйте.
Кто бы мог подсказать - какими средствами можно было бы воспользоваться для поиска в файла нужного фрагмента. В частности - mp3 тег. Мне необходимо найти тег TCON после которого указан жанр. Но проблема вот в чем - в зависимости от версии теги могут быть как в начале так и в конце - и неизвестен отступ. Какими бы средствами порекомендовали воспользоваться? Кроме поиска подстроки TCON простым посимвольным считыванием и сравнением с нужной строкой. Потому что для файла 6мб - это длится достаточно долго. Название: Re: Поиск по файлу Отправлено: Blackwanderer от Сентябрь 26, 2010, 14:14 Код: Какими бы средствами порекомендовали воспользоваться? Название: Re: Поиск по файлу Отправлено: olympian от Сентябрь 26, 2010, 14:38 Нет - понятное дело что в данной задаче можно найти готовое.
Но хотелось бы знать какие подходы можно использовать - если задача просто поиск строки в большом файле. Название: Re: Поиск по файлу Отправлено: Sancho_s_rancho от Сентябрь 26, 2010, 14:51 Нет - понятное дело что в данной задаче можно найти готовое. Чудес не бывает. Так что тут 2 варианта.Но хотелось бы знать какие подходы можно использовать - если задача просто поиск строки в большом файле. 1) Формат файла известен. Зная формат ищешь там, где сказано документом. 2) Формат файла неизвестен(маловероятная ситуация). Перебираешь все. Это ресурсоемко, глупо и опасно, т.к. в этом файле (не mp3, а нашем абстрактном) такое сочетание байт может получиться случайным образом. Название: Re: Поиск по файлу Отправлено: Sancho_s_rancho от Сентябрь 26, 2010, 15:05 http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm (http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm) Тут найдете описание ID3v1 и ссылку на спецификации второй версии тегов. Название: Re: Поиск по файлу Отправлено: lighting от Сентябрь 27, 2010, 09:43 Ну по-моему в случае с mp3 есть достаточно простое решение - проверяем первые скажем 100 Кб файла (для тэгов этого думаю достаточно), если не находим - идем в конец файла и проверяем последние 100 Кб. Так при файле любого размера искать придется в лучшем случае в 100 Кб, а в худшем случае в 200.
Название: Re: Поиск по файлу Отправлено: Denjs от Сентябрь 27, 2010, 10:06 Кроме поиска подстроки TCON простым посимвольным считыванием и сравнением с нужной строкой. Потому что для файла 6мб - это длится достаточно долго. Поиск подстроки простым посимвольным считываним и сравнением с нужной строкой в несколько потоков?вы по любому должны будете его сначала в память считать... а это взаимодействие с внешними устройствами как правило медленнее чем обработка... и потом вы всеравно будете проверять каждый байт. как ускориться? использование простого С (без классов), обработка с помощью ассемблерных вставок, считавание файла в память блоками и т.п.... не? Название: Re: Поиск по файлу Отправлено: Sancho_s_rancho от Сентябрь 27, 2010, 11:17 Ну по-моему в случае с mp3 есть достаточно простое решение - проверяем первые скажем 100 Кб файла (для тэгов этого думаю достаточно), если не находим - идем в конец файла и проверяем последние 100 Кб. Так при файле любого размера искать придется в лучшем случае в 100 Кб, а в худшем случае в 200. Теговая информация в последних версиях стандарта может занимать мегабайты. Программировать "по-понятиям" -- тупиковый путь.Название: Re: Поиск по файлу Отправлено: Igors от Сентябрь 27, 2010, 11:59 Ничего страшного в "просто поиске" по файлу нет. Это секунды для гигабайтных файлов. Можно на С, можно и на С++ (если не ляпать контейнерами абы как). Ассемблерные вставки - ну это уже история :)
Другое дело что найдя сигнатуру тега, Вам все равно нечего делать дальше если формат неизвестен. Поэтому лучше разбирать по тегам чем искать строку. Порядочный формат следует IFF спецификации - сигнатура тега (4 байта) - длина данных (4 байта) - данные тега (длина задана в предыдущем) Как правило, все записано на диск в big endian. Читаете - пропускаете (seek) пока не найдете нужный тег. Необходимо учитывать что нужный тег может быть вложен в другой. Успехов. Название: Re: Поиск по файлу Отправлено: olympian от Сентябрь 27, 2010, 17:39 Ничего страшного в "просто поиске" по файлу нет. Это секунды для гигабайтных файлов. Можно на С, можно и на С++ (если не ляпать контейнерами абы как). Ассемблерные вставки - ну это уже история :) Другое дело что найдя сигнатуру тега, Вам все равно нечего делать дальше если формат неизвестен. Поэтому лучше разбирать по тегам чем искать строку. Порядочный формат следует IFF спецификации - сигнатура тега (4 байта) - длина данных (4 байта) - данные тега (длина задана в предыдущем) Как правило, все записано на диск в big endian. Читаете - пропускаете (seek) пока не найдете нужный тег. Необходимо учитывать что нужный тег может быть вложен в другой. Успехов. Вот тут либо Вы либо я ошибаюсь в формате. Если я понял - про формат фрейма - вы описали 3 или 4 версию(потому что сигнатура 4 байта) Но подобная структура была в ID3v2.2 только с 3 байтами сигнатуры и 3 байтами длины данных. А вот в 3 или 4 - ввели доп. поля, которые могут быть, могут не быть - в зависимости от флагов в начале файла. Но в спецификации я не особо понял как с ними работать. Так же как в hex-редакторе так и не понял про длину данных... Она либо на 1 байт больше, то меньше - чем длина содержимого тега.. Не могли бы подсказать, если Вы знаете, более подробно описание фреймов последних версий? Название: Re: Поиск по файлу Отправлено: Igors от Сентябрь 27, 2010, 18:50 Не могли бы подсказать, если Вы знаете, более подробно описание фреймов последних версий? Я совершенно не знаком с форматом конкретно Ваших файлов, просто очень многие следуют IFF и это предполагает "теги". Ваша проблема стандартна: Вы не знаете (и не хотите знать) все-все что может быть в файле - Вам надо найти нужный тег. Значит должен быть механизм позволяющий пропускать неизвестные теги и искать нужные. Возможно это не тот механизм что я описал. Но зачем бы городить свой если IFF прекрасно устраивает?Но подобная структура была в ID3v2.2 только с 3 байтами сигнатуры и 3 байтами длины данных. 3 - байта на длину?? Не верю! У программиста рука не подымется писать по 3 байта :) Должно быть 4Лучше всего найти описание формата. Если нет - загрузите сюда файл (небольшой) посмотрим что это за зверь Название: Re: Поиск по файлу Отправлено: olympian от Сентябрь 27, 2010, 19:31 Я не горожу свой формат - а следую формату используемому в mp3 файлах. Мне оттуда нужен лишь жанр
Поверьте - я был сам удивлен 3м байтам на длину) Формат то - обычный - mp3 - вполне себе знаком=) http://lisper.ru/pcl/practical-an-id3-parser раздел ID3 Frames. Так же можете посомтреть в в hex редакторе ) Название: Re: Поиск по файлу Отправлено: Igors от Сентябрь 27, 2010, 20:02 Так же можете посомтреть в в hex редакторе ) Не увидел там файла, пожалуйста "ткните носиком" :)Название: Re: Поиск по файлу Отправлено: olympian от Сентябрь 27, 2010, 21:53 Так же можете посомтреть в в hex редакторе ) Не увидел там файла, пожалуйста "ткните носиком" :)Не там :) У себя на компьютере найти mp3 с тегами версии ID3v2.2. (файл начинается с ID3 а следом байт со значением 2). И там глянуть любой фрейм Название: Re: Поиск по файлу Отправлено: Igors от Сентябрь 28, 2010, 13:18 Не там :) Ну так где ж взять если нету? :) Мои mp3 начинаются с ID3 но потом байт 3. Ладно. гуглим, вот нормальная спецификация http://www.id3.org/id3v2.3.0 (http://www.id3.org/id3v2.3.0). Смотрим файл в hex. Первые 10 байт заголовок. Затем первый тег TIT2 (4 байта). Затем длина (4 байта). потом они всунули 2 байта флагов. Так, длина 7, пропускаем. Следующий тег TPE1. И.т.д. Чего не хватает? Разбирайте файл согласно его формату - и все дела.У себя на компьютере найти mp3 с тегами версии ID3v2.2. (файл начинается с ID3 а следом байт со значением 2). И там глянуть любой фрейм |