将嵌套结构转换为字节数组

发布于 2025-01-29 11:24:19 字数 1663 浏览 3 评论 0原文

该代码

using System;
using System.Runtime.InteropServices;

class Program {

   [StructLayout(LayoutKind.Sequential, Pack = 1)]
   public struct Inner{
      public byte firstByte;
      public byte secondByte;
    };
   [StructLayout(LayoutKind.Sequential, Pack = 1)]
   public struct Outer{
      public short firstShort;
      public Inner[] inners;
    };

  public static byte[] ConvertStructToByteArray(object obj)
  {
      int len = Marshal.SizeOf(obj);
      byte[] arr = new byte[len];
      IntPtr ptr = Marshal.AllocHGlobal(len);
      Marshal.StructureToPtr(obj, ptr, true);
      Marshal.Copy(ptr, arr, 0, len);
      Marshal.FreeHGlobal(ptr);
      return arr;
  }

  
  public static void Main (string[] args) {
    Console.WriteLine ("Hello World");
    var inner = new Inner();
    inner.firstByte = 0x00;
    inner.secondByte = 0x01;
    var outer = new Outer();
    outer.firstShort = 0x0000;
    outer.inners = new Inner[]{inner};
    var byteArray = ConvertStructToByteArray(outer);
  }
}

应该将外部 struct实例转换为字节数组,而是抛出了

Unhandled exception. System.ArgumentException: Type 'Program+Outer' cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed.
   at System.Runtime.InteropServices.Marshal.SizeOfHelper(Type t, Boolean throwIfNotMarshalable)
   at System.Runtime.InteropServices.Marshal.SizeOf(Object structure)
   at Program.ConvertStructToByteArray(Object obj) in /home/runner/ZigzagGracefulDatum/main.cs:line 23
   at Program.Main(String[] args) in /home/runner/ZigzagGracefulDatum/main.cs:line 47

为什么大小评估有问题?如何修复?有更好的解决方案吗?

The code

using System;
using System.Runtime.InteropServices;

class Program {

   [StructLayout(LayoutKind.Sequential, Pack = 1)]
   public struct Inner{
      public byte firstByte;
      public byte secondByte;
    };
   [StructLayout(LayoutKind.Sequential, Pack = 1)]
   public struct Outer{
      public short firstShort;
      public Inner[] inners;
    };

  public static byte[] ConvertStructToByteArray(object obj)
  {
      int len = Marshal.SizeOf(obj);
      byte[] arr = new byte[len];
      IntPtr ptr = Marshal.AllocHGlobal(len);
      Marshal.StructureToPtr(obj, ptr, true);
      Marshal.Copy(ptr, arr, 0, len);
      Marshal.FreeHGlobal(ptr);
      return arr;
  }

  
  public static void Main (string[] args) {
    Console.WriteLine ("Hello World");
    var inner = new Inner();
    inner.firstByte = 0x00;
    inner.secondByte = 0x01;
    var outer = new Outer();
    outer.firstShort = 0x0000;
    outer.inners = new Inner[]{inner};
    var byteArray = ConvertStructToByteArray(outer);
  }
}

is supposed to convert the outer struct instance into a byte array, but instead throws

Unhandled exception. System.ArgumentException: Type 'Program+Outer' cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed.
   at System.Runtime.InteropServices.Marshal.SizeOfHelper(Type t, Boolean throwIfNotMarshalable)
   at System.Runtime.InteropServices.Marshal.SizeOf(Object structure)
   at Program.ConvertStructToByteArray(Object obj) in /home/runner/ZigzagGracefulDatum/main.cs:line 23
   at Program.Main(String[] args) in /home/runner/ZigzagGracefulDatum/main.cs:line 47

Why is there a problem with the size evaluation? How can it be fixed? Is there a better solution?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文