【问题标题】:How to write a struct to a pre existing byte array?如何将结构写入预先存在的字节数组?
【发布时间】:2017-11-21 22:23:38
【问题描述】:

我已经看到很多关于如何通过创建新字节数组将结构体转换为字节数组的示例。

但我试图避免这种情况。我有一个字节 [1024] 的消息缓冲区,我想从索引 1 开始将我的结构写入这个字节数组。索引 0 是标题,所以我跳过那个。

在不创建新字节数组的情况下,我找不到任何示例。这甚至可能吗?

我目前如何将对象转换为字节数组:

    public static byte[] GetBytes<T>(T data)
    {
        int size = Marshal.SizeOf(data);
        byte[] arr = new byte[size];
        IntPtr ptr = Marshal.AllocHGlobal(size);

        Marshal.StructureToPtr(data, ptr, true);
        Marshal.Copy(ptr, arr, 0, size);
        Marshal.FreeHGlobal(ptr);

        return arr;
    }

问题在于它在索引 0 处的新数组上写入对象。我需要将其应用到索引 1 以后。其中索引 0 将指定结构的大小(以字节为单位)。

【问题讨论】:

  • 如果你想使用现有的字节数组而不是创建一个新的,那么传入现有的字节数组并使用它。使用有什么问题?
  • 您使用的是哪个序列化 API?有哪些例子?没有将任意结构转换为字节数组的规范方法,因此除非您使用更多信息或特定示例来限制问题,否则答案可能会到处都是。
  • 能否请您展示您用于创建新字节数组的代码?
  • 我将添加我当前元帅的代码示例。
  • @Servy 我预先存在的空字节数组是 1024 字节长我不知道如何向它写入结构,因此问题的目的。我只知道如何从索引 0 处的新字节数组中执行此操作。

标签: c# arrays serialization buffer


【解决方案1】:

以您现有的代码为例,为了将您的结构字节复制到位置 1 的现有数组中,只需将现有数组和 1 的起始位置传递给 Marshal.Copy

byte[] existingArray = new byte[1024];      // This is your existing 1024 size byte array

int size = Marshal.SizeOf(data);
IntPtr ptr = Marshal.AllocHGlobal(size);

Marshal.StructureToPtr(data, ptr, true);
Marshal.Copy(ptr, existingArray, 1, size);  // Pass your array and start at position 1
Marshal.FreeHGlobal(ptr);]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    相关资源
    最近更新 更多