StructLayout在C#中的具体应用案例

   2024-10-06 8750
核心提示:使用StructLayout指定字段在内存中的布局顺序using System;using System.Runtime.InteropServices;[StructLayout(LayoutKind.Seq

使用StructLayout指定字段在内存中的布局顺序

using System;using System.Runtime.InteropServices;[StructLayout(LayoutKind.Sequential)]struct Point{    public int x;    public int y;}class Program{    static void Main()    {        Point p = new Point();        p.x = 10;        p.y = 20;        byte[] buffer = new byte[Marshal.SizeOf(p)];        IntPtr ptr = Marshal.AllocHGlobal(buffer.Length);        Marshal.StructureToPtr(p, ptr, false);        Marshal.Copy(ptr, buffer, 0, buffer.Length);        foreach (byte b in buffer)        {            Console.Write($"{b} ");        }        Marshal.FreeHGlobal(ptr);    }}

在上面的示例中,通过使用StructLayout(LayoutKind.Sequential)指定Point结构体中字段的布局顺序为按顺序排列。然后将Point结构体实例转换为字节数组,并输出每个字节的值。

使用StructLayout指定字段的偏移量
using System;using System.Runtime.InteropServices;[StructLayout(LayoutKind.Explicit)]struct Union{    [FieldOffset(0)]    public byte b1;    [FieldOffset(1)]    public byte b2;    [FieldOffset(0)]    public short s1;}class Program{    static void Main()    {        Union u = new Union();        u.s1 = 257;        Console.WriteLine(u.b1); // 输出1        Console.WriteLine(u.b2); // 输出1    }}

在上面的示例中,通过使用StructLayout(LayoutKind.Explicit)指定Union结构体中字段的布局方式为显式布局。然后使用FieldOffset指定了字段的偏移量,使得b1和b2共享同一内存空间,从而可以通过不同的字段访问同一内存位置的值。

 
举报打赏
 
更多>同类物流大全
推荐图文
推荐物流大全
点击排行

网站首页  |  关于我们  |  联系方式 | 网站留言    |  赣ICP备2021007278号