Чтение двоичного файла в структуру с использованием C ++ / CLI - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть проблема (и я думаю, что ее легко решить, но она сводит меня с ума).Я проверил другие сообщения, но я не смог найти решение.

Я хотел бы прочитать двоичный файл в структуру с использованием C ++ / CLI.Проблема в том, что после прочтения некоторые значения не соответствуют правильным.В приведенном ниже примере все поля структуры хорошо читаются до «а» (включено) (около байта 100).Из этого поля остальные имеют неправильные значения.Я знаю, что они имеют неправильные значения и исходный файл правильный, так как я ранее использовал Python, а также FileStream и BinaryReader из C ++ / CLI.Однако я больше не использую их, учитывая, что я хотел бы прочитать двоичный файл в структуру.

Кроме того, в некоторых случаях у меня также есть значение -1 для переменной "size" (sizeфайла), но не всегда.Я не уверен, может ли он получить неправильное значение, когда файл слишком большой.

Поэтому мой вопрос, можете ли вы увидеть что-то, чего я не могу, или я делаю что-то не так.

struct LASheader
{
    unsigned short x;
    char y[16];
    unsigned char v1;
    unsigned char v2;
    char y1[68];
    unsigned short a;
    unsigned long b;
    unsigned long c;
    unsigned char z;
    unsigned short d;
    unsigned long e;
}

void main()
{    
    FILE *ptr = fopen("E:\\Pablo\\file.las", "rb");
    //I go at the end of the file to get the size
    fseek(ptr, 0L, SEEK_END);
    unsigned long long size = ftell(ptr);

    struct LASheader lasHeader;
    //I want an offset of 6 bytes
    fseek(ptr, 6, SEEK_SET);
    fread(&lasHeader, sizeof(lasHeader), 1, ptr);

    unsigned short a1 = lasHeader.a;
    unsigned long b1 = lasHeader.b;
    unsigned long c1 = lasHeader.c;
    unsigned short d1 = lasHeader.d;
    unsigned long e1 = lasHeader.e;
}

Спасибо!

Пабло.

1 Ответ

0 голосов
/ 24 апреля 2018

Здесь есть пара вещей. Сначала я займусь прямой проблемой.


Вы не сказали, как создавался этот двоичный формат, но я думаю, что это проблема выравнивания.

Без директивы #pragma pack, unsigned long b будет соответствовать 4-байтовой границе. Элементы структуры с x по a имеют общую длину 90 байт, поэтому два байта заполнения вставляются между a и b, так что b выравнивается правильно.

Чтобы исправить выравнивание, вы можете окружить структуру с помощью #pragma pack(push, 1) и #pragma pack(pop).


Во-вторых, более общая проблема:

Вы назвали этот код C ++ / CLI и пометили его как C ++ / CLI, но на самом деле вы не используете никаких управляемых функций в этом коде. Кроме того, вы сказали, что у вас есть некоторый код C #, который работает с использованием BinaryReader, а BinaryReader отлично работает в C ++ / CLI, поэтому у вас уже есть решение C ++ / CLI.

Если остальная часть вашего C ++ / CLI-проекта работает таким образом (без использования управляемого кода), рассмотрите возможность переключения вашего проекта на C ++ или, возможно, его разбиения. Если в вашем проекте в основном используется управляемый код, я настоятельно рекомендую использовать BinaryReader вместо fopen для чтения этих данных.

...