【问题标题】:Convert a byte array to a class containing a byte array in C#在 C# 中将字节数组转换为包含字节数组的类
【发布时间】:2010-05-02 23:16:08
【问题描述】:

我有一个 C# 函数,它可以将字节数组转换为类,给定它的类型:

IntPtr buffer = Marshal.AllocHGlobal(rawsize);
Marshal.Copy(data, 0, buffer, rawsize);
object result = Marshal.PtrToStructure(buffer, type);
Marshal.FreeHGlobal(buffer);

我使用顺序结构:

[StructLayout(LayoutKind.Sequential)]
public new class PacketFormat : Packet.PacketFormat { }

这很好,直到我尝试转换为包含字节数组的结构/类。

[StructLayout(LayoutKind.Sequential)]
public new class PacketFormat : Packet.PacketFormat
{
  public byte header;
  public byte[] data = new byte[256];
}

Marshal.SizeOf(type) 返回 16,该值太低(应为 257)并导致 Marshal.PtrToStructure 失败并出现以下错误:

试图读取或写入受保护的内存。这通常表明其他内存已损坏。

我猜使用固定数组会是一种解决方案,但也可以不用求助于不安全的代码来完成吗?

【问题讨论】:

  • 你能用二进制序列化器/反序列化器代替吗? mikehadlow.blogspot.com/2006/11/…
  • 你能多介绍一下你正在做的事情吗?如果可能的话,使用内置的序列化类会省去很多麻烦。

标签: c# serialization struct


【解决方案1】:

不需要不安全的代码:

[StructLayout(LayoutKind.Sequential)]
public struct PacketFormat
{
  public byte header;
  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public byte[] data;
}

【讨论】:

    【解决方案2】:

    您需要使用固定大小的字节数组。

    [StructLayout(LayoutKind.Sequential)]
    public unsafe struct PacketFormat
    {
      public byte header;
      public fixed byte data[256];
    }
    

    【讨论】:

    • 我的问题是它是否可以在没有不安全代码的情况下完成。
    猜你喜欢
    • 2014-12-19
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2011-07-02
    • 2019-12-10
    • 1970-01-01
    相关资源
    最近更新 更多