请来看看,小弟我从exe文件中读取了一段字节,小弟我知道它是IMAGE_NT_HEADERS结构,就用BinaryFormatter()反序列化,结果出错

请来看看,我从exe文件中读取了一段字节,我知道它是IMAGE_NT_HEADERS结构,就用BinaryFormatter()反序列化,结果出错,
      
我从一个exe文件里读取一段字节数组arryBtye, 它是个IMAGE_NT_HEADERS32结构,
开始我只是简单直接的用下标访问值arryBtye[0] arryBtye[1]....
后来我感觉这样访问很麻烦 很容易出错,

于就是通过 PInvoke平台调用导进了IMAGE_NT_HEADERS32结构
并且想通过 BinaryFormatter()把它直接刻成IMAGE_NT_HEADERS32结构
的数据,这样就可以容易访问了,结果下面那个注释的个地方报:

  An unhandled exception of type 'System.Runtime.Serialization.SerializationException' occurred in mscorlib.dllAdditional information: 输入流是无效的二进制格式。开始内容(以字节为单位)是: 50-45-00-00-4C-01-04-00-01-52-CF-53-00-00-00-00-00...
 
public static IMAGE_NT_HEADERS32
            Deserialize<T>(byte[] byteArray)
           
        {
            IFormatter formatter = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            ms.Write(byteArray, 0, byteArray.Length);
            ms.Position = 0;
//下面这句出错,它
            IMAGE_NT_HEADERS32 o = (IMAGE_NT_HEADERS32)formatter.Deserialize(ms);
            return o;

        }

我确定自己扣出来的字节数组就是完整无误的IMAGE_NT_HEADERS32,但是转不过来呀我去...请问怎么办
------解决方案--------------------
不可以的,因为 C# 的 序列化是有格式头的。
不是纯粹的 二进制。
使用 Marshal。
------解决方案--------------------
封装和转换可以参考这个
http://www.cr173.com/html/11930_1.html

至于那个结构体最终翻译是


[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct IMAGE_NT_HEADERS32 {
    
    /// DWORD->unsigned int
    public uint Signature;
    
    /// IMAGE_FILE_HEADER->_IMAGE_FILE_HEADER
    public IMAGE_FILE_HEADER FileHeader;
    
    /// IMAGE_OPTIONAL_HEADER->IMAGE_OPTIONAL_HEADER32->_IMAGE_OPTIONAL_HEADER
    public IMAGE_OPTIONAL_HEADER32 OptionalHeader;
}

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct IMAGE_FILE_HEADER {
    
    /// WORD->unsigned short
    public ushort Machine;
    
    /// WORD->unsigned short
    public ushort NumberOfSections;
    
    /// DWORD->unsigned int
    public uint TimeDateStamp;
    
    /// DWORD->unsigned int
    public uint PointerToSymbolTable;
    
    /// DWORD->unsigned int
    public uint NumberOfSymbols;
    
    /// WORD->unsigned short
    public ushort SizeOfOptionalHeader;
    
    /// WORD->unsigned short
    public ushort Characteristics;
}

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct IMAGE_OPTIONAL_HEADER32 {
    
    /// WORD->unsigned short
    public ushort Magic;
    
    /// BYTE->unsigned char
    public byte MajorLinkerVersion;
    
    /// BYTE->unsigned char
    public byte MinorLinkerVersion;
    
    /// DWORD->unsigned int
    public uint SizeOfCode;
    
    /// DWORD->unsigned int
    public uint SizeOfInitializedData;
    
    /// DWORD->unsigned int
    public uint SizeOfUninitializedData;
    
    /// DWORD->unsigned int
    public uint AddressOfEntryPoint;
    
    /// DWORD->unsigned int
    public uint BaseOfCode;
    
    /// DWORD->unsigned int
    public uint BaseOfData;
    
    /// DWORD->unsigned int