解析自定义二进制平面文件的首选方法?

Tre*_*com 6 c# parsing flat-file

我有一个由C程序生成的平面文件.文件中的每条记录都包含一个固定长度的标题,后跟数据.标题包含指示以下数据大小的字段.我的最终目标是编写一个C#/ .NET程序来查询这个平面文件,所以我正在寻找使用C#读取文件的最有效方法.

我在以下代码中找不到第7行的.NET等效项.据我所知,我必须发出多次读取(使用BinaryReader为标头的每个字段一次),然后发出一次读取以获取标头后面的数据.我正在尝试学习一种在两次读取操作中解析记录的方法(一次读取以获取固定长度的头部,另一次读取以获取以下数据).

这是我试图使用C#/ .NET复制的C代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

这是标题的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;
};
Run Code Online (Sandbox Code Playgroud)

我想出了这个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;
}
Run Code Online (Sandbox Code Playgroud)

Tre*_*com 0

汉斯·帕桑特提供的链接有答案。我会给他信用,但我不知道该怎么做,因为他发布的是评论而不是答案。