Convert a byte array to a class containing a byte array in C#

I've got a C# function that converts a byte array to a class, given it's type:

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

I use sequential structs:

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

This worked fine, until I tried to convert to a struct/class containing a byte array.

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

Marshal.SizeOf(type) returns 16, which is too low (should be 257) and causes Marshal.PtrToStructure to fail with the following error:

Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

I'm guessing that using a fixed array would be a solution, but can it also be done without having to resort to unsafe code?

Answers


No need for unsafe code:

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

You need to use a fixed size byte array.

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

Need Your Help

modify fflush() that guarantee calling ungetc() twice in a row in C

c stdio fflush getc ungetc

I'm a C beginner, I want to call ungetc() twice in a row although I know in regular C it is not permitted. Someone told me I can modify Fflush() to do this job, however I don't know how to do it.

increment a variable based on loop count

php loops foreach language-construct

I have a PHP function where an undefined number of images in a directory are being output to the browser. The images are being read in to an object. The issue I'm having is how the images are pre...