2016-09-18 2 views
-1

Я пытаюсь получить доступ к некоторому члену данных внутри двоичного файла, используя определение структуры.Доступ к члену struct в C++

Внутри файла, он должен содержать элемент структуры, называемый fxID. В следующем коде я пытаюсь получить доступ к fxID, но он не работает, он возвращает неправильный номер. Еще более странно, если я изменю fxID на fxVersion, я получаю тот же номер, так что кажется, что printf не собирает правильные данные вообще.

FILE *p; 
struct myStruct x; 
p=fopen("myfile.fxb","rb"); 

size_t n = fread(&x, sizeof(x), 1, p); 
if (n != 1) { 
    // Some error message 
    //printf("%i", sizeof(x)); 
} else { 
    printf("\n\nID:%d\n", x.fxID); 
} 

Любая идея, почему я не могу получить доступ к данным внутри fxID? Я получаю странные результаты в зависимости от того, какой тип я использую в инструкции printf. Например, я получаю номер 1606416148, если я использую printf («% d», x.fxID); Однако это неправильно, потому что я считаю, что fxID - это 1447514692. Это из-за энтианности? Я знаю, что файл большой endian, и он упоминает что-то о необходимости его преобразования в файл заголовка, с которым я связан.

Возможно, это связано с использованием Int? или, возможно, неправильный тип?

+1

Я думаю, у меня дежа-Vous - http://stackoverflow.com/questions/39556266/cc-extract-struct-member-from-binary-file/39556551#comment66424088_39556551 –

+0

может понадобиться маркер в начале файл относительно версии, т.е. 'VST_2_4_EXTENSIONS' –

+0

Да, я забыл добавить, что в моем собственном определении структуры я удаляю оператор if, и я все еще пытаюсь понять, почему я не могу получить доступ к данным внутри структур в значимом путь. Все еще не нашли решения проблем, с которыми я сталкиваюсь. –

ответ

1

Endianess необходимо исправить, если тот, который используется в файле, отличается от используемого платформой. Если формат хранится с использованием макета большого конца, то, если вы работаете с x64, вам придется поменять байты каждого многобайтового поля.

Но этого недостаточно, чтобы гарантировать, что макет вашего struct совпадает с форматом, используемым в формате файла, поскольку он может содержать требования к заполнению и выравниванию, поэтому, в общем случае, если вы хотите десериализовать двоичные данные непосредственно внутри struct вы должны позаботиться о нескольких вещах.

В любом случае, если полученный результат 16064 1 6148, и вы ожидали 1447514692 тогда порядок байт не является единственной проблемой, так как в шестнадцатеричной соответственно 0x5FBFF714 и 0x56475244, которые не имеют одинаковое значение с различными байтов.

Вы используете &x.fxID, который возвращает адрес fxID поля внутри структуры, которая не является значением, попробуйте использовать x.fxID directy.

+0

ОК, меняют на x.fxID напрямую, и теперь он возвращается 0. Мне интересно, почему это так? Это должно быть 1447514692. Я также не могу получить доступ к другим частям структуры, таким как fxVersion. Есть ли вероятность, что вы можете проверить файл, который я прикреплл для подтверждения? –

+0

Странно, когда я использую x.byteSize, он дает мне шестнадцатеричное значение 6b427846, которое является kBxF, это назад (из-за большого endian) является FxBk. Итак, почему сообщение FxBk выходит в переменной byteSize, когда оно должно быть найдено в fxMagic ?? Очевидно, что данные каким-то образом смещены? –

Смежные вопросы