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