Russian Qt Forum

Qt => Общие вопросы => Тема начата: olympian от Сентябрь 26, 2010, 14:03



Название: Поиск по файлу
Отправлено: 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 с тегами версии ID3v2.2. (файл начинается с ID3 а следом байт со значением 2). И там глянуть любой фрейм
Ну так где ж взять если нету?  :)  Мои 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. И.т.д. Чего не хватает? Разбирайте файл согласно его формату - и все дела.