首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 文件流讀寫結構體(一):StructLayout 與佈局控制基礎

     編輯:關於C語言

動機

需解析 .NET Micro Framework 字體文件頭部,希望像 C/C++ 一樣直接將文件流讀入結構體,避免逐字段解析。

佈局控制屬性

Explicit 佈局示例:聯合體


[StructLayout(LayoutKind.Explicit)]
struct TestUnion
{
    [FieldOffset(0)] public int i;
    [FieldOffset(0)] public double d;
    [FieldOffset(0)] public char c;
    [FieldOffset(0)] public byte b;
}
// 所有字段共享起始地址,類似 C union

Explicit 佈局示例:自定義偏移


[StructLayout(LayoutKind.Explicit)]
struct TestExplicit
{
    [FieldOffset(0)]  public long lg;   // 0-7
    [FieldOffset(0)]  public int i1;    // 0-3
    [FieldOffset(4)]  public int i2;    // 4-7
    [FieldOffset(8)]  public double d;  // 8-15
    [FieldOffset(16)] public char c;    // 16-17
    [FieldOffset(18)] public byte b;    // 18
}

Sequential 佈局(推薦大多數場景)


[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct FontHeader
{
    public uint Version;      // 4
    public ushort FontCount;  // 2
    public ushort Height;     // 2
    // Pack=1 禁用對齊填充,確保與文件格式完全一致
}

關鍵參數 Pack

  • 控制字段對齊邊界(1, 2, 4, 8, 16)。
  • Pack=1 表示無填充,按順序緊湊排列,適合文件格式映射。
  • 默認 Pack=0 跟隨平台(通常 8 字節對齊)。

後續預告

下一篇將展示完整的 Marshal 序列化/反序列化封裝、文件讀寫代碼、實測結構體與二進制文件映射案例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
屬性用途
[StructLayout(LayoutKind.Sequential)]按聲明順序緊湊排列(默認),字段自動對齊
[StructLayout(LayoutKind.Explicit)]手動控制每個字段偏移,需配合 [FieldOffset]
[FieldOffset(offset)]指定字段在結構體中的絕對字節偏移
[MarshalAs(UnmanagedType.xxx)]指定字段非托管表示形式(如字符串編碼、數組形式)