Что такое эквивалент C # / .net для записи двоичных данных непосредственно в структуру? - PullRequest
3 голосов
/ 17 ноября 2010

Точная структура структуры не важна.

Из того, что я понял, следующий код c читает «кусок» двоичных данных (равный размеру структуры) и напрямую записывает его вструктура (т.е. первые 32 байта для имени, следующие 2 байта для атрибута и т. д.).Есть ли какой-либо эквивалент в коде, управляемом C #?

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

Примечание.это важно.Я не могу, например, просто использовать сериализацию / десеризацию .net, потому что я буду обрабатывать существующие существующие файлы (изменение формата невозможно).

typedef struct _PDB 
{
   char name[32];
   unsigned short attrib;
   unsigned short version;
   unsigned int created;
   unsigned int modified;
   unsigned int backup;
   unsigned int modNum;
   unsigned int nextRecordListID;
   unsigned short numRecs;
} PDB;

void getFileType(FILE *in) 
{
   PDB p;
   fseek(in, 0, SEEK_SET);
   fread(&p, sizeof(p), 1, in);
. . .
}

Ответы [ 2 ]

7 голосов
/ 17 ноября 2010

Я думаю, что вы спрашиваете о StructLayoutAttribute и FieldOffsetAttribute .

Пример (фрагмент) с сайта MSDN:

[StructLayout(LayoutKind.Explicit, Size=16, CharSet=CharSet.Ansi)]
public class MySystemTime 
{
   [FieldOffset(0)]public ushort wYear; 
   [FieldOffset(2)]public ushort wMonth;
   [FieldOffset(4)]public ushort wDayOfWeek; 
   [FieldOffset(6)]public ushort wDay; 
   [FieldOffset(8)]public ushort wHour; 
   [FieldOffset(10)]public ushort wMinute; 
   [FieldOffset(12)]public ushort wSecond; 
   [FieldOffset(14)]public ushort wMilliseconds; 
}
2 голосов
/ 17 ноября 2010

Посмотрите на Marshalling, это ИМХО, что вы ищете.

Эта ссылка содержит подробный обзор структур в C #:

http://www.developerfusion.com/article/84519/mastering-structs-in-c/

Дополнительную информацию можно найти в документации MSDN по классу маршала:

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...