Попытка выбить довольно простую программу Qt (как и все, на что я способен!)...
... Я прочитал довольно маленький двоичный файл в QbyteArray, и я вижу, что QByteArray правильно держит эти данные. Я хотел бы направить указатель на структуру указателю на данные в QByteArray, чтобы я мог легко получить доступ к данным в файле. Однако это просто не работает, как я ожидал.
Например:
struct fileHeaderStruct
{
uint16_t fileType;
uint32_t fileSize;
uint16_t reserved1;
uint16_t reserved2;
uint32_t startOffset;
};
QByteArray blob = file.readAll();
blob содержит в начале своего массива данных:
42 4D 5E 04 00 00 00 00 00 36 04 00 00 28 00 00 00
Если я передам указатель на файлHeaderStruct таким образом:
struct fileHeaderStruct* header;
header = (struct fileHeaderStruct*)blob.data();
header.fileType правильный как 0x4D42, но все остальное неверно
размер файла 0, зарезервировано 1, 0 - зарезервировано2 0x436, а startOffset - 0x280000
fileSize должен быть 0x45E - он полностью потерял эти два байта и показывая остальную часть структуры, как если бы эти два байта не существовали.
Итак, кто-нибудь знает, почему он потерял или пропустил эти два байта, пожалуйста?
Благодарю!
Прочтите это: http://www.catb.org/esr/structure-packing/. Ваша структура упаковки неверна для заказа, в котором у вас есть члены. По умолчанию упаковка будет соответствовать размеру машинного слова, в этом случае почти наверняка 32 бита. Я думаю:
#pragma pack(16)
struct fileHeaderStruct { ...
};
#pragma pack()
должен дать вам ожидаемые результаты, в зависимости от того, какой компилятор вы используете.
struct
везде, как вы делаете, это не C. Просто используйтеfileHeaderStruct* header;
вместоstruct fileHeaderStruct* header;
,