Russian Qt Forum
Ноябрь 27, 2024, 08:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Поиск по файлу  (Прочитано 6813 раз)
olympian
Гость
« : Сентябрь 26, 2010, 14:03 »

Здравствуйте.

Кто бы мог подсказать - какими средствами можно было бы воспользоваться для поиска в файла нужного фрагмента.
В частности - mp3 тег. Мне необходимо найти тег TCON после которого указан жанр.
Но проблема вот в чем - в зависимости от версии теги могут быть как в начале так и в конце - и неизвестен отступ.
Какими бы средствами порекомендовали воспользоваться?
Кроме поиска подстроки TCON простым посимвольным считыванием и сравнением с нужной строкой. Потому что для файла 6мб - это длится достаточно долго.
Записан
Blackwanderer
Гость
« Ответ #1 : Сентябрь 26, 2010, 14:14 »

Код:
Какими бы средствами порекомендовали воспользоваться?
Я бы порекомендовал поискать готовые библиотеки для работы с музыкой/тегами.
Записан
olympian
Гость
« Ответ #2 : Сентябрь 26, 2010, 14:38 »

Нет - понятное дело что в данной задаче можно найти готовое.
Но хотелось бы знать какие подходы можно использовать - если задача просто поиск строки в большом файле.
Записан
Sancho_s_rancho
Гость
« Ответ #3 : Сентябрь 26, 2010, 14:51 »

Нет - понятное дело что в данной задаче можно найти готовое.
Но хотелось бы знать какие подходы можно использовать - если задача просто поиск строки в большом файле.
Чудес не бывает. Так что тут 2 варианта.
1) Формат файла известен. Зная формат ищешь там, где сказано документом.
2) Формат файла неизвестен(маловероятная ситуация). Перебираешь все. Это ресурсоемко, глупо и опасно, т.к. в этом файле (не mp3, а нашем абстрактном) такое сочетание байт может получиться случайным образом.

Записан
Sancho_s_rancho
Гость
« Ответ #4 : Сентябрь 26, 2010, 15:05 »


http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm
Тут найдете описание ID3v1 и ссылку на спецификации второй версии  тегов.
Записан
lighting
Гость
« Ответ #5 : Сентябрь 27, 2010, 09:43 »

Ну по-моему в случае с mp3 есть достаточно простое решение - проверяем первые скажем 100 Кб файла (для тэгов этого думаю достаточно), если не находим - идем в конец файла и проверяем последние 100 Кб. Так при файле любого размера искать придется в лучшем случае в 100 Кб, а в худшем случае в 200.
Записан
Denjs
Гость
« Ответ #6 : Сентябрь 27, 2010, 10:06 »

Кроме поиска подстроки TCON простым посимвольным считыванием и сравнением с нужной строкой. Потому что для файла 6мб - это длится достаточно долго.
Поиск подстроки простым посимвольным считываним и сравнением с нужной строкой в несколько потоков?

вы по любому должны будете его сначала в память считать... а это взаимодействие с внешними устройствами как правило медленнее чем обработка... и потом вы всеравно будете проверять каждый байт.
как ускориться? использование простого С (без классов), обработка с помощью ассемблерных вставок, считавание файла в память блоками и т.п....  не?
« Последнее редактирование: Сентябрь 27, 2010, 10:08 от Denjs » Записан
Sancho_s_rancho
Гость
« Ответ #7 : Сентябрь 27, 2010, 11:17 »

Ну по-моему в случае с mp3 есть достаточно простое решение - проверяем первые скажем 100 Кб файла (для тэгов этого думаю достаточно), если не находим - идем в конец файла и проверяем последние 100 Кб. Так при файле любого размера искать придется в лучшем случае в 100 Кб, а в худшем случае в 200.

Теговая информация в последних версиях стандарта может занимать мегабайты. Программировать "по-понятиям" -- тупиковый путь.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Сентябрь 27, 2010, 11:59 »

Ничего страшного в "просто поиске" по файлу нет. Это секунды для гигабайтных файлов. Можно на С, можно и на С++ (если не ляпать контейнерами абы как). Ассемблерные вставки - ну это уже история  Улыбающийся

Другое дело что найдя сигнатуру тега, Вам все равно нечего делать дальше если формат неизвестен. Поэтому лучше разбирать по тегам чем искать строку. Порядочный формат следует IFF спецификации

- сигнатура тега (4 байта)
- длина данных (4 байта)
- данные тега (длина задана в предыдущем)

Как правило, все записано на диск в big endian. Читаете - пропускаете (seek) пока не найдете нужный тег. Необходимо учитывать что нужный тег может быть вложен в другой. Успехов.

Записан
olympian
Гость
« Ответ #9 : Сентябрь 27, 2010, 17:39 »

Ничего страшного в "просто поиске" по файлу нет. Это секунды для гигабайтных файлов. Можно на С, можно и на С++ (если не ляпать контейнерами абы как). Ассемблерные вставки - ну это уже история  Улыбающийся

Другое дело что найдя сигнатуру тега, Вам все равно нечего делать дальше если формат неизвестен. Поэтому лучше разбирать по тегам чем искать строку. Порядочный формат следует IFF спецификации

- сигнатура тега (4 байта)
- длина данных (4 байта)
- данные тега (длина задана в предыдущем)

Как правило, все записано на диск в big endian. Читаете - пропускаете (seek) пока не найдете нужный тег. Необходимо учитывать что нужный тег может быть вложен в другой. Успехов.

Вот тут либо Вы либо я ошибаюсь в формате. Если я понял - про формат фрейма - вы описали 3 или 4 версию(потому что сигнатура 4 байта)
Но подобная структура была в ID3v2.2 только с 3 байтами сигнатуры и 3 байтами длины данных.

А вот в 3 или 4 - ввели доп. поля, которые могут быть, могут не быть - в зависимости от флагов в начале файла. Но в спецификации я не особо понял как с ними работать. Так же как в hex-редакторе так и не понял про длину данных... Она либо на 1 байт больше, то меньше - чем длина содержимого тега..

Не могли бы подсказать, если Вы знаете, более подробно описание фреймов последних версий?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Сентябрь 27, 2010, 18:50 »

Не могли бы подсказать, если Вы знаете, более подробно описание фреймов последних версий?
Я совершенно не знаком с форматом конкретно Ваших файлов, просто очень многие следуют IFF и это предполагает "теги". Ваша проблема стандартна: Вы не знаете (и не хотите знать) все-все что может быть в файле - Вам надо найти нужный тег. Значит должен быть механизм позволяющий пропускать неизвестные теги и искать нужные. Возможно это не тот механизм что я описал. Но зачем бы городить свой если IFF прекрасно устраивает?

Но подобная структура была в ID3v2.2 только с 3 байтами сигнатуры и 3 байтами длины данных.
3 - байта на длину?? Не верю! У программиста рука не подымется писать по 3 байта  Улыбающийся Должно быть 4

Лучше всего найти описание формата. Если нет - загрузите сюда файл (небольшой) посмотрим что это за зверь
Записан
olympian
Гость
« Ответ #11 : Сентябрь 27, 2010, 19:31 »

Я не горожу свой формат - а следую формату используемому в mp3 файлах. Мне оттуда нужен лишь жанр

Поверьте - я был сам удивлен 3м байтам на длину)
Формат то - обычный - mp3 - вполне себе знаком=)

http://lisper.ru/pcl/practical-an-id3-parser

раздел ID3 Frames.
Так же можете посомтреть в в hex редакторе )
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Сентябрь 27, 2010, 20:02 »

Так же можете посомтреть в в hex редакторе )
Не увидел там файла, пожалуйста "ткните носиком"  Улыбающийся
Записан
olympian
Гость
« Ответ #13 : Сентябрь 27, 2010, 21:53 »

Так же можете посомтреть в в hex редакторе )
Не увидел там файла, пожалуйста "ткните носиком"  Улыбающийся

Не там Улыбающийся
У себя на компьютере найти mp3 с тегами версии ID3v2.2. (файл начинается с ID3 а следом байт со значением 2). И там глянуть любой фрейм
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Сентябрь 28, 2010, 13:18 »

Не там Улыбающийся
У себя на компьютере найти mp3 с тегами версии ID3v2.2. (файл начинается с ID3 а следом байт со значением 2). И там глянуть любой фрейм
Ну так где ж взять если нету?  Улыбающийся  Мои mp3 начинаются с ID3 но потом байт 3. Ладно. гуглим, вот нормальная спецификация http://www.id3.org/id3v2.3.0.  Смотрим файл в hex. Первые 10 байт заголовок. Затем первый тег TIT2 (4 байта). Затем длина (4 байта). потом они всунули 2 байта флагов. Так, длина 7, пропускаем. Следующий тег TPE1. И.т.д. Чего не хватает? Разбирайте файл согласно его формату - и все дела.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.059 секунд. Запросов: 23.