Чтение файла в структуру с типами больше байта - PullRequest
0 голосов
/ 31 октября 2018

Я прочитал файл в структуру, используя этот код:

StructType aStruct;
int count = Marshal.SizeOf(typeof(StructType));
byte[] readBuffer = new byte[count];
BinaryReader reader = new BinaryReader(stream);
readBuffer = reader.ReadBytes(count);
GCHandle handle = GCHandle.Alloc(readBuffer, GCHandleType.Pinned);
aStruct = (StructType) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(StructType));
handle.Free();

Но я заметил, что любая переменная размером больше байта, например int32, int16, получает данные в обратном направлении. Например, если в файле данные были: AA BB CC DD соответствующая переменная (int32) будет: DD CC BB AA.

Моя структура определена с атрибутом [StructLayout(LayoutKind.Sequential), Pack = 1]

Кто-нибудь знает, почему и как это решить?

Спасибо!

1 Ответ

0 голосов
/ 31 октября 2018

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

  • Если вы можете изменить формат файла, это было бы простым решением. Это упростит загрузку и сохранение файла.
  • Прочитайте структуру с ее полями "неправильный путь", затем обойдите все поля и переверните их, например, с помощью битовых манипуляций, , например, . Относительно легко случайно оставить поле в неправильном порядке.
  • Откажитесь от простого чтения с простой копией, вместо этого читайте поля по одному, каждое в порядке с прямым порядком байтов, например, используя одну из этих опций .
...