Привести структуру к QByteArray?

0

Попытка выбить довольно простую программу 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 - он полностью потерял эти два байта и показывая остальную часть структуры, как если бы эти два байта не существовали.

Итак, кто-нибудь знает, почему он потерял или пропустил эти два байта, пожалуйста?

Благодарю!

  • 1
    Вам не нужно включать struct везде, как вы делаете, это не C. Просто используйте fileHeaderStruct* header; вместо struct fileHeaderStruct* header; ,
  • 1
    Вы должны узнать о заполнении структуры и выравнивании структуры .
Показать ещё 4 комментария
Теги:
qt

1 ответ

2

Прочтите это: http://www.catb.org/esr/structure-packing/. Ваша структура упаковки неверна для заказа, в котором у вас есть члены. По умолчанию упаковка будет соответствовать размеру машинного слова, в этом случае почти наверняка 32 бита. Я думаю:

#pragma pack(16)
struct fileHeaderStruct { ...

};
#pragma pack() 

должен дать вам ожидаемые результаты, в зависимости от того, какой компилятор вы используете.

  • 1
    __attribute __ ((упакованы)); было то, что сделал трюк. Нашел в записи в Википедии.
  • 0
    Кстати, какой компилятор вы используете?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню