【问题标题】:How do I copy bytes into a struct variable in C#?如何将字节复制到 C# 中的结构变量中?
【发布时间】:2015-09-11 18:22:14
【问题描述】:

我有一个struct abc,我想将字节复制到一个结构变量中。类似于 C/C++ 中的 memcpy。 我通过套接字接收字节,它们是同一 struct abc 变量的字节。

[StructLayout(LayoutKind.Sequential, Pack = 1)]    
public struct abc
{ 
         public int a;
         public int b;
         public float c;
         public char[] d; //30 size
}

【问题讨论】:

  • 这基本上是一种脆弱的方法 - 例如,您依赖于两台机器的字节序相同。我怀疑你也需要 char 数组为 fixed。我会强烈建议不要使用这样的可变结构,并且绝对反对假设一台机器上的内存表示在另一台机器上是合适的。
  • 看看Marshal.PtrToStructure()Marshal.StructureToPtr()方法
  • 虽然直接复制字节更快,但在传输字节时考虑使用序列化/反序列化来保持数据一致性。
  • 由于需要 fixed 数组,如果不使用 unsafe 代码,您将无法执行此操作。您应该通过使用附加到输入缓冲区的MemoryStream 流读取器来访问变量并将读取的数据分配给结构成员来解决此问题。即使那样,你也可能会遇到终结性问题。请参阅Jon's answer here 以获得解决方案。

标签: c# sockets struct byte memcpy


【解决方案1】:

您可以将字节数组转换为您的结构,如下所示:

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

            Marshal.Copy(arr, 0, ptr, size);

            var struct = (abc)Marshal.PtrToStructure(ptr, typeof(abc));
            Marshal.FreeHGlobal(ptr);

struct 现在是您转换后的结构。不过请记住已经提出的 cmets(即字节顺序)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2012-02-25
    • 2010-10-03
    • 2011-10-25
    • 2020-12-15
    • 1970-01-01
    相关资源
    最近更新 更多