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

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

Страниц: 1 [2] 3 4 5   Вниз
  Печать  
Автор Тема: [РЕШЕНО]Чтение бинарного файла  (Прочитано 30841 раз)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #15 : Апрель 22, 2016, 17:11 »

Old, а можно пример?
У меня есть подобная задача и я прям чувствую, что криво считываю данные. Больше всего смущает, что QDataStream использует version. И не совсем понятно, как читать массивы, циклом?
Пример чтения? Так там все просто. Массивы QDataStream сохраняет вначале кол-во элементов (quint32), а затем сами элементы. Все это описано в документации.
Записан
Larry
Гость
« Ответ #16 : Апрель 22, 2016, 17:12 »

Тоже верно:). Сейчас создам другой и выложу...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Апрель 22, 2016, 17:15 »

У меня есть подобная задача и я прям чувствую, что криво считываю данные. Больше всего смущает, что QDataStream использует version. И не совсем понятно, как читать массивы, циклом?
QDataStream по умолчанию читает в большой индиане, а здесь маленькая, используйте QDataStream::setByteIrder(QDataStream::LittleEndian). Со строками ясно, с массивами - сделайте запись где по 1 (или 2) эл-та в каждом, тогда прояснится
Записан
Larry
Гость
« Ответ #18 : Апрель 22, 2016, 17:18 »

Вот файл...
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #19 : Апрель 22, 2016, 17:59 »

Пример чтения? Так там все просто. Массивы QDataStream сохраняет вначале кол-во элементов (quint32), а затем сами элементы. Все это описано в документации.
У меня тоже файл, полученный из другой программы, спецификацию которого я разгадывал при помощи читалки этого файла и самописного hex просмотрщика. И там размерности массива не стоят перед данными. Там примерно такая запись: блаблаблаРАЗМЕРМАССИВАблаблаблаXXXYYYZZZ.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #20 : Апрель 22, 2016, 18:28 »

У меня тоже файл, полученный из другой программы, спецификацию которого я разгадывал при помощи читалки этого файла и самописного hex просмотрщика. И там размерности массива не стоят перед данными. Там примерно такая запись: блаблаблаРАЗМЕРМАССИВАблаблаблаXXXYYYZZZ.
И вы не знаете для чего поля блаблабла?
Сложно так сказать... это могут быть случайные данные оставшиеся от выравнивания полей структуры или маркеры данных или ... Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #21 : Апрель 22, 2016, 20:45 »

Есть бинарный файл в который записаны данные из структуры на delphi.
Смотрю я на данные и что-то не сходится. Судя по данным похоже, что структура чуть другая - поля percentTopLevel и percentBottomLevel расположены не в конце, а после сенсоров:

Код:
TData=record
      id:string[10];
      comment:string[200];
      primarySensor,kindAnalysisSensor:byte;
      percentTopLevel,percentBottomLevel:real;
      countPointData:integer;
      v,u,a,b:array of real;
end;

Уточните у разработчиков программы-писателя.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #22 : Апрель 22, 2016, 21:08 »

Пример чтения? Так там все просто. Массивы QDataStream сохраняет вначале кол-во элементов (quint32), а затем сами элементы. Все это описано в документации.
У меня тоже файл, полученный из другой программы, спецификацию которого я разгадывал при помощи читалки этого файла и самописного hex просмотрщика. И там размерности массива не стоят перед данными. Там примерно такая запись: блаблаблаРАЗМЕРМАССИВАблаблаблаXXXYYYZZZ.

Может, это был TLV формат: тег длина значение
тогда, блаблабла -- это тег
Записан

Larry
Гость
« Ответ #23 : Апрель 22, 2016, 22:59 »

эта структура выдернута из исходников и порядок я не менял... Судя по структуре, то percentTopLevel и percentBottomLevel и не находятся в конце?! или я не так понял.
« Последнее редактирование: Апрель 22, 2016, 23:00 от Larry » Записан
Larry
Гость
« Ответ #24 : Апрель 23, 2016, 07:56 »

Не понятно, как читать:)...судя по hex там в начале идет 5 байт, а потом уже идет id - 10 байт и следом comment - 200 байт. По структуре первое поле id. Непонятно...
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #25 : Апрель 23, 2016, 08:01 »

Не понятно, как читать:)...судя по hex там в начале идет 5 байт, а потом уже идет id - 10 байт и следом comment - 200 байт. По структуре первое поле id. Непонятно...
Я же вам на первой странице все расписал.  Строит глазки
Записан
Larry
Гость
« Ответ #26 : Апрель 23, 2016, 08:16 »

Я попытался прочить в int и получил 16777216, т.е. это явно не int.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #27 : Апрель 23, 2016, 08:20 »

Я попытался прочить в int и получил 16777216, т.е. это явно не int.
Первые четыре байта это 32-битное число в little-endian, поэтому для его корректного чтения, нужно QDataStream переключить на использование этого эндиана:
void QDataStream::setByteOrder(ByteOrder bo)
Записан
Larry
Гость
« Ответ #28 : Апрель 23, 2016, 08:22 »

Спасибо, сейчас попробую.
Записан
Larry
Гость
« Ответ #29 : Апрель 23, 2016, 08:29 »

Да, сейчас при чтении в int получаю единицу, там как раз одна структура. А как из QDataStream прочитать в QString?
Записан
Страниц: 1 [2] 3 4 5   Вверх
  Печать  
 
Перейти в:  


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