c# - 在 C# 中将对象列表转换为字节数组

标签 c# arrays

我有这个结构定义:

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/

相关文章:

c++ - 查找两个数组中的共同元素

javascript - 在 Javascript 中有效组合多个数组方法转换

php - 如何使用 DateTime 将两个日期之间的日期放入数组中

c# - Xamarin.iOS异步等待方法不起作用

c# - 从线程返回一个值

c# - 通过 REST API 删除短信和语音的 Twilio 演示 URL

c# - 慢正则表达式拆分

c# - 如何向 HttpClient.GetAsync 返回的任务添加更多详细信息

javascript - 返回 json 对象 nightwatch.js

php - MySQL : Request to make an JSON object with Array