代码之家  ›  专栏  ›  技术社区  ›  Gerald Davis

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

  •  3
  • Gerald Davis  · 技术社区  · 14 年前

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

    我收集到的以下c代码是读取二进制数据的“块”(相当于结构的大小)并直接将其写入结构(即名称的前32个字节,attrib的后2个字节,等等)。在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);
    . . .
    }
    
    2 回复  |  直到 9 年前
        1
  •  7
  •   myermian    14 年前

    我想你是在问 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
  •  2
  •   FuePi    14 年前

    看看马歇尔,你要找的是他。

    此链接深入查看了C中的结构:

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

    其他信息可在MSDN的封送处理类文档中找到:

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