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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: ЧТЕНИЕ БИНАРНИКА  (Прочитано 5022 раз)
kraven
Гость
« : Апрель 04, 2010, 17:05 »

Всем привет )

Народ, есть задача, на входе бинарный файл с некоторыми данными в виде кадров (ЗАГОЛОВОК_ТЕЛО КАДРА)
Заголовков может быть 8 разных типов (допустим, храню их в словаре, размер заголовка 4 байта)

Как лучше всего отыскать все кадры? (думаю сначала весь файл в qbytearray запихать...)

очень нужно, просто новичок в QT пока что.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Апрель 04, 2010, 17:12 »

я бы QDataStream юзал
Записан
kraven
Гость
« Ответ #2 : Апрель 04, 2010, 18:00 »

можете набросать структурку кода, как именно находить заголовки ?
Записан
alexman
Гость
« Ответ #3 : Апрель 04, 2010, 19:23 »

Если существуют 4 байта, то читаешь с помощью QDataStream 4 байта и проверяешь значение...
Записан
kraven
Гость
« Ответ #4 : Апрель 04, 2010, 19:29 »

ну а как оптимальнее организовать сравнение этих 4 байт со списком из словаря ?
Записан
alexman
Гость
« Ответ #5 : Апрель 04, 2010, 19:51 »

int QList::indexOf ( const T & value, int from = 0 ) const
Записан
kraven
Гость
« Ответ #6 : Апрель 04, 2010, 19:57 »

т.е. эти 4 байта ищем Indexof в словаре ?  Непонимающий
Записан
kraven
Гость
« Ответ #7 : Апрель 15, 2010, 14:27 »

придумал след алгоритм

считываем весь файл в bytearray
потом mid считываем кусочек и в словаре делаем indexof - если найден то берем, иначе сдвигаем тек позицию.


вроде самый оптимальный способ
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Апрель 15, 2010, 14:57 »

придумал след алгоритм

считываем весь файл в bytearray
потом mid считываем кусочек и в словаре делаем indexof - если найден то берем, иначе сдвигаем тек позицию.


вроде самый оптимальный способ
по-моему самый неоптимальный  Улыбающийся Почему не по-народному?

Код
C++ (Qt)
QFile file(fileName);
if (!file.open(QFile::ReadOnly)
return ErrorOpen(file);
 
QDataStream strm(&file);
quint32 tagType, tagSize;
while (!f.atEnd()) {
tagType << strm;                // big endian по умолчанию
tagSize << strm;                // как правило, за типом всегда идет длина тега
 
if (file.errorQFile::ReadOnly)
 return ErrorRead(file);
 
// разбираем теги
switch (tagType) {
  case 'TAG1':
    if (!ReadTag1(strm, tagSize)) return false;
    break;
 
  case 'TAG2':
    if (!ReadTag2(strm, tagSize)) return false;
    break;
 
  ....
  ....
 
// неизвестный тег, пропускаем
  default:
    file.seek(file.pos() + tagSize);
}
}
 
Записан
kraven
Гость
« Ответ #9 : Апрель 17, 2010, 21:15 »

проблема в том, что там может быть мусор, причем не кратный длине заголовка или содержимого

т.е. в файле:

мусор_заголовок_содержимое_мусор_мусор_заголовок_содержимое
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Апрель 18, 2010, 15:29 »

проблема в том, что там может быть мусор, причем не кратный длине заголовка или содержимого

т.е. в файле:

мусор_заголовок_содержимое_мусор_мусор_заголовок_содержимое
Если так - то конечно. Но такой формат не выглядит разумным. Как правило, длина данных в файл записывается, тем более что речь идет о кадрах. Стоит (пере)проверить
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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