我有这个结构定义:
public struct ChangedByte
{
public byte R;
public byte G;
public byte B;
public int x;
public int y;
}
我创建了一个:
List<ChangedByte> testme = new List<ChangedByte>();
(并向其中添加项目)
我将其转换为数组:
ChangedByte[] alpha = testme.ToArray();
我在 SO 上发现了一个类似的问题:
byte[] StructureToByteArray(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;
}
我这样调用它:
byte[] test = StructureToByteArray(alpha);
我得到错误:
Type 'new_encoder.Form1+ChangedByte[]' cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed.
我想将对象列表转换为字节数组(并且可能避免序列化,因为它往往会增加数组的大小)
可以吗?
附加:
我已经尝试将 Struct 修改为:
public struct ChangedByte
{
[MarshalAs(UnmanagedType.LPWStr)]
public byte R;
[MarshalAs(UnmanagedType.LPWStr)]
public byte G;
[MarshalAs(UnmanagedType.LPWStr)]
public byte B;
[MarshalAs(UnmanagedType.LPWStr)]
public int x;
[MarshalAs(UnmanagedType.LPWStr)]
public int y;
}
还是一样的错误
最佳答案
在这种情况下,由于您不仅要转换结构,还要转换结构数组,因此您需要遍历数组并转换每一项。使用指针算法在缓冲区中移动并添加项目。
public static byte[] StructureArrayToByteArray(ChangedByte[] objs)
{
int structSize = Marshal.SizeOf(typeof(ChangedByte));
int len = objs.Length * structSize;
byte[] arr = new byte[len];
IntPtr ptr = Marshal.AllocHGlobal(len);
for (int i = 0; i < objs.Length; i++ ) {
Marshal.StructureToPtr(objs[i], ptr + i*structSize, true);
}
Marshal.Copy(ptr, arr, 0, len);
Marshal.FreeHGlobal(ptr);
return arr;
}
关于c# - 在 C# 中将对象列表转换为字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28252564/