Предпочтительный способ анализ пользовательского двоичного плоского файла?

У меня есть плоский файл, созданный программой на Си. Каждая запись в файле состоит из заголовка фиксированной длины, за которым следуют данные. Заголовок содержит поле, указывающее размер следующих данных. Моя конечная цель - написать программу на C # / .NET для запроса этого плоского файла, поэтому я ищу наиболее эффективный способ чтения файла с использованием C #.

У меня проблемы с поиском .NET-эквивалента строки 7 в следующем коде. Насколько я могу сказать, Я должен выполнить несколько операций чтения (по одному для каждого поля заголовка с помощью BinaryReader), а затем выполнить одно чтение, чтобы получить данные после заголовка. Я пытаюсь научиться анализировать запись в двух операциях чтения (одна - для получения заголовка фиксированной длины, а вторая - для получения следующих данных).

Это код C, который я пытаюсь продублировать, используя C # /. NET:

struct header header; /* 1-byte aligned structure (48 bytes) */
char *data;

FILE* fp = fopen("flatfile", "r");
while (!feof(fp))
{
  fread(&header, 48, 1, fp);
  /* Read header.length number of bytes to get the data. */
  data = (char*)malloc(header.length);
  fread(data, header.length, 1, fp);
  /* Do stuff... */
  free(data);
}

Это структура C заголовка:

struct header
{
    char  id[2];
    char  toname[12];
    char  fromname[12];
    char  routeto[6];
    char  routefrom[6];
    char  flag1;
    char  flag2;
    char  flag3;
    char  flag4;
    char  cycl[4];
    unsigned short len;
};

Я придумал этот объект C # для представления заголовка C:

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi, Size = 48)]
class RouterHeader
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
    char[] Type;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
    char[] To;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
    char[] From;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    char[] RouteTo;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    char[] RouteFrom;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    char[] Flags;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    char[] Cycle;

    UInt16 Length;
}
6
задан Trevor Balcom 21 August 2010 в 16:02
поделиться