Проблема с чтением в структуру |
Здравствуйте, гость ( Вход | Регистрация )
Проблема с чтением в структуру |
x-8973 |
28.3.2014, 9:52
Сообщение
#1
|
Студент Группа: Участник Сообщений: 25 Регистрация: 22.2.2013 Пользователь №: 3720 Спасибо сказали: 0 раз(а) Репутация: 0 |
Доброго здравия всем.
Задача: прочитать из бинарного файла последовательность байт и распихать ее в поля структуры. Проблема: определил структуру как тип, описал переменную этого типа. Чтение из файла проходит нормально, в переменной типа QByteArray лежат считанные байты. Пытаюсь "наложить" адрес переменной-структуры на адрес переменной-массива: Widget.h
Сам код:
В результате на входе (в переменной-массиве) считанные данные появляются, а в переменной-структуре - каша. Что не так? Может, я что-то упустил? |
|
|
ilyabvt |
28.3.2014, 16:56
Сообщение
#2
|
Активный участник Группа: Участник Сообщений: 297 Регистрация: 23.6.2011 Пользователь №: 2765 Спасибо сказали: 45 раз(а) Репутация: 3 |
Размер структуры не обязательно равен сумме размеров всех полей. Компилятор может выравнивать поля.
Можно отключить выравнивание в компиляторе или использовать нестандартные ключевые слова типа "packed". Можно писать в файл именно структуру, но есть нюанс: если скомпилировать 2 экземпляра приложения (сплошь и рядом в опенсорсе), с выравниванием и без него, то файлы будут бинарно несовместимы. Можно читать отдельно по полям. |
|
|
x-8973 |
28.3.2014, 19:30
Сообщение
#3
|
Студент Группа: Участник Сообщений: 25 Регистрация: 22.2.2013 Пользователь №: 3720 Спасибо сказали: 0 раз(а) Репутация: 0 |
Проблему удалось решить следующим способом:
Описание структуры вынес из класса; Считал данные напрямую в переменную-структуру с помощью перегруженного метода quint64 QFile::read(const char* s, uint64 len); Код сейчас не смогу привести, ибо проект остался на рабочей машине. ilyabvt, за выравнивание отвечают директивы #pragma pack(push, 1) и #pragma pack(pop) в заголовочнике. Файл пишется абсолютно другой программой, написанной в Qt, интегрированном в ВижлСтудию. На удивление, там чтение написанным мной изначально способом вполне нормально работает. Сегодня полдня всем отделом голову ломали, что не так. |
|
|
Iron Bug |
28.3.2014, 20:34
Сообщение
#4
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
а как и где используется структура? вообще, с потоковыми данными и указателями на динамические структуры надо быть осторожным. они существуют только на момент вызова. при любом изменении объекта они становятся невалидны.
ну и у разных компиляторов могут быть разные схемы по представлению разных типов данных. Сообщение отредактировал Iron Bug - 28.3.2014, 20:35 |
|
|
x-8973 |
29.3.2014, 7:30
Сообщение
#5
|
Студент Группа: Участник Сообщений: 25 Регистрация: 22.2.2013 Пользователь №: 3720 Спасибо сказали: 0 раз(а) Репутация: 0 |
|
|
|
Iron Bug |
29.3.2014, 11:56
Сообщение
#6
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
|
|
|
Алексей1153 |
4.4.2014, 19:03
Сообщение
#7
|
фрилансер Группа: Участник Сообщений: 2939 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
x-8973, на всякий случай замечу: не нужно выравнивать всё подряд, достаточно только нужную "жёсткую" часть, а именно твою железную структуру
x-8973, как вариант быстрой установки диагноза: сохранить дампы отправленных и принятых массивов в обеих программах (я так понял, их у вас два варианта). Естественно, они должны совпадать Если это не так - проанализировать, где покривилось. Результаты в студию |
|
|
Текстовая версия | Сейчас: 19.4.2024, 10:45 |