У вас нет такого же управления доступом к памяти низкого уровня, как у C или C ++. Вам нужно будет выполнить некоторую ручную работу, когда у вас есть массив неопределенной длины в C #.
Вот несколько способов сделать это.
struct B
{
public int b_a;
}
struct A
{
public int sizeB;
public B[] b;
}
Первый - BinaryWriter. Это может быть быстрее, если в вашей структуре не много полей.
static byte[] ConvertToByte(A a)
{
using (var ms = new MemoryStream())
using (var writer = new BinaryWriter(ms))
{
writer.Write(a.sizeB);
foreach (var b in a.b)
writer.Write(b.b_a);
return ms.ToArray();
}
}
Другой - использовать маршаллинг, как вы, но явно перебирать массив.
static byte[] ConvertToByte(A a)
{
var bStructSize = Marshal.SizeOf<B>();
var size = bStructSize * a.b.Length;
var arr = new byte[size + 4];
var ptr = Marshal.AllocHGlobal(size);
for (int i = 0; i < a.b.Length; i++)
Marshal.StructureToPtr(a.b[i], ptr + i * bStructSize, true);
Marshal.Copy(ptr, arr, 4, size);
Array.Copy(BitConverter.GetBytes(a.sizeB), arr, 4);
return arr;
}