Russian Qt Forum

Qt => Общие вопросы => Тема начата: kraven от Апрель 04, 2010, 17:05



Название: ЧТЕНИЕ БИНАРНИКА
Отправлено: kraven от Апрель 04, 2010, 17:05
Всем привет )

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

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

очень нужно, просто новичок в QT пока что.


Название: Re: ЧТЕНИЕ БИНАРНИКА
Отправлено: Авварон от Апрель 04, 2010, 17:12
я бы QDataStream юзал


Название: Re: ЧТЕНИЕ БИНАРНИКА
Отправлено: kraven от Апрель 04, 2010, 18:00
можете набросать структурку кода, как именно находить заголовки ?


Название: Re: ЧТЕНИЕ БИНАРНИКА
Отправлено: alexman от Апрель 04, 2010, 19:23
Если существуют 4 байта, то читаешь с помощью QDataStream 4 байта и проверяешь значение...


Название: Re: ЧТЕНИЕ БИНАРНИКА
Отправлено: kraven от Апрель 04, 2010, 19:29
ну а как оптимальнее организовать сравнение этих 4 байт со списком из словаря ?


Название: Re: ЧТЕНИЕ БИНАРНИКА
Отправлено: alexman от Апрель 04, 2010, 19:51
int QList::indexOf ( const T & value, int from = 0 ) const


Название: Re: ЧТЕНИЕ БИНАРНИКА
Отправлено: kraven от Апрель 04, 2010, 19:57
т.е. эти 4 байта ищем Indexof в словаре ?  ???


Название: Re: ЧТЕНИЕ БИНАРНИКА
Отправлено: kraven от Апрель 15, 2010, 14:27
придумал след алгоритм

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


вроде самый оптимальный способ


Название: Re: ЧТЕНИЕ БИНАРНИКА
Отправлено: Igors от Апрель 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);
}
}
 


Название: Re: ЧТЕНИЕ БИНАРНИКА
Отправлено: kraven от Апрель 17, 2010, 21:15
проблема в том, что там может быть мусор, причем не кратный длине заголовка или содержимого

т.е. в файле:

мусор_заголовок_содержимое_мусор_мусор_заголовок_содержимое


Название: Re: ЧТЕНИЕ БИНАРНИКА
Отправлено: Igors от Апрель 18, 2010, 15:29
проблема в том, что там может быть мусор, причем не кратный длине заголовка или содержимого

т.е. в файле:

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