【问题标题】:How to convert Struct Array to Byte Array in c#?如何在 C# 中将结构数组转换为字节数组?
【发布时间】:2014-07-03 12:37:01
【问题描述】:

使用 Buffer.BlockCopy() 很容易将原始类型转换为字节。

但是如果我有一个 DateTime 数组,我应该使用哪个函数将 DateTime[] 转换为 byte[]?

如果我有一个恒定大小的 struct(这意味着我可以使用 Marshal 将 struct 转换为 byte[]),我应该使用哪种方式将 T[](struct array) 转换为 byte[]?

【问题讨论】:

标签: c# arrays struct marshalling


【解决方案1】:

如果您要获取底层内存中表示的副本,那么一种方法是仅访问数据 unsafe - 类似于:

// invent some data
DateTime[] original = new DateTime[10];
for (int i = 0; i < original.Length; i++)
    original[i] = new DateTime(2014, 1, i + 1);

byte[] blob = new byte[original.Length * sizeof(DateTime)];

fixed (DateTime* src = original)
fixed (byte* dest = blob)
{
    DateTime* typedDest = (DateTime*)dest;
    for(int i = 0; i < original.Length; i++)
    {
        typedDest[i] = src[i];
    }
} 

但是,这在很大程度上取决于您期望 byte[] 之后的内容以及您打算如何处理它。

【讨论】:

  • 我想发送很多 DateTime[] 到 network ,所以我需要一个快速的方法来做到这一点。
  • @NorSD 所以...您的网络协议期望什么格式?表示刻度的 int-32 或 int-64 是否不够?
  • 我之前使用的方式是存储为long[](现在我们可以使用Buffer.BlockCopy to byte[]),也就是DateTime.Ticks,效果很好。我不知道在 32/64 系统中 DateTime 的大小是否不同。(我认为它始终是 8 个字节)。现在有大量的 DateTime[] ,所以我想找到一种方法来轻松快速地转换它们。将它们转换为 byte[] 后,我将通过套接字发送到网络。接收者可能是本地 c++ 客户端。
猜你喜欢
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
相关资源
最近更新 更多