C# 如何将字节数组封送到结构?

C# 如何将字节数组封送到结构?,c#,struct,bytearray,C#,Struct,Bytearray,在相关的问题中,我试图找出最快的方法。我在那个问题上选择的方法已经成为我的瓶颈。我正在从文件中读取一些二进制数据,需要将其放入托管结构定义中。没有涉及非托管代码,因此我认为有一种比分配GCHandle更好的方法 有没有一种方法可以将字节数组强制转换为相同大小的结构?我有这样一种方法: static public T ReadStructure<T>(byte[] bytes) where T : struct { int len = Marshal.SizeOf(ty

在相关的问题中,我试图找出最快的方法。我在那个问题上选择的方法已经成为我的瓶颈。我正在从文件中读取一些二进制数据,需要将其放入托管结构定义中。没有涉及非托管代码,因此我认为有一种比分配GCHandle更好的方法


有没有一种方法可以将字节数组强制转换为相同大小的结构?

我有这样一种方法:

static public T ReadStructure<T>(byte[] bytes)
    where T : struct
{
    int len = Marshal.SizeOf(typeof(T));
    IntPtr i = Marshal.AllocHGlobal(len);

    try
    {
        Marshal.Copy(bytes, 0, i, len);
        return (T)Marshal.PtrToStructure(i, typeof(T));
    }
    finally
    {
        Marshal.FreeHGlobal(i);
    }
}
静态公共T读取结构(字节[]字节)
其中T:struct
{
int len=Marshal.SizeOf(typeof(T));
IntPtr i=封送。AllocHGlobal(len);
尝试
{
封送处理副本(字节,0,i,len);
return(T)Marshal.ptr结构(i,typeof(T));
}
最后
{
弗里赫全球元帅(一);
}
}

诚然,它不是很快——但在我的情况下,它不需要很快。这是您当前的解决方案吗?您发现alloc/copy/release开销太慢了吗?

您可以查看以下代码:


struct Foo
{
  public int x;
}

public unsafe static void Main()
{
  byte[] x = new byte[] { 1, 1, 0, 0 };
  Foo f;

  fixed (byte* xPtr = x)
  {
    f = *((Fpp*)xPtr);
  }

  Console.WriteLine(f.x);
}

这肯定是非常不安全的,如果结构包含一些更复杂的类型,您可能会遇到问题。

跨32/64位边界使用此方法有什么意义?是否有任何方法可以保证所有可能共享此方法存储和读取的数据的计算机上的表示完全相似?什么是Fpp?当我尝试使用我的类型进行类似的声明时,我得到“无法获取托管类型的地址、大小或声明指向托管类型的指针”,我想他是想写Foo,而不是Fpp。是的,应该是Foo,而不是Fpp:)。至于32/64位边界-1。你会在指针方面遇到一些问题,2。默认情况下,c#中的结构具有顺序布局,因此您不应该对它们感到意外。3.您可以使用[StructLayout(Explicit)]并根据需要进行排列。顺便说一句,这个方法不是我用于生产代码的方法,有些地方它会被破坏。我可以试试这个。问题是我必须读取254个字节,检查前240个字节是否包含类型,如果是,请继续。使用这种方法,我从文件中读取数据,将前240个字节复制到ptr,检查它,然后将整个254复制到ptr。大量的复制正在发生。听起来有很多优化的途径。“你能发布一些代码吗?”本,相关的问题有一个我现在正在做的例子。既然你正在从一个文件中读取,你可能会考虑调用/调用Win32文件访问方法;您可以将一大块内存分配为IntPtr,直接读取它,然后直接从中封送,而无需复制到托管字节[]缓冲区或从托管字节[]缓冲区复制。它看起来稍微快一点,而且肯定占用更少的内存。我看看会怎么样,谢谢