将二进制数据直接写入结构体的C#/ .net等价物是什么?

Ger*_*vis 3 .net c c#

结构的确切结构并不重要.

从我收集的内容中,下面的c代码是读取二进制数据的"块"(等于结构的大小)并直接将其写入结构(即前32个字节到名称,接下来2个字节到attrib等).C#托管代码中是否有任何等价物?

请提供显示类似结果的代码snipet.为了节省时间,您可以将只简化为几个元素,并假设已经初始化了相应的文件流类型对象.

注意:我将使用现有的遗留数据文件,因此现有数据文件的格式化/打包非常重要.我不能仅仅使用.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);
. . .
}
Run Code Online (Sandbox Code Playgroud)

m-y*_*m-y 7

我想你在询问StructLayoutAttributeFieldOffsetAttribute.

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

  • 你速度更快:) +1 (2认同)
  • @theUnhandledException:C#支持联合(通过使用与myermian节目相同的代码重叠字段),因此您只需添加一个字节数组即可."正确"的方法可能是使用`Marshal`,尽管`BinaryFormatter`也可以用于此目的.后者可能会填充元数据,因此您需要使用`BinaryFormatter`来读取它.理查德泰勒解释如何用"元帅"[这里](http://geekswithblogs.net/taylorrich/archive/2006/08/21/88665.aspx)做到这一点 (2认同)