大家好,由于我只会C++,现在又一份C#需要做一个小小的改动。。我需要帮助。我从文件中读取了一段内容到Buffer,
这段Buffer是我用C++程序写入的一个结构体。
struct IMAGE_TLS_DIRECTORY32
{
    DWORD StartAddressOfRawData;
    DWORD EndAddressOfRawData;
    DWORD AddressOfIndex;
    DWORD AddressOfCallBacks;
    DWORD SizeOfZeroFill;
    DWORD Characteristics;
} 现在我需要在C#中操作它。根据我查到的一些资料。。我先在C#中定义这样一个结构体: 
public struct IMAGE_TLS_DIRECTORY32
{
    public   fixed   uint StartAddressOfRawData;
    public   fixed   uint EndAddressOfRawData;
    public   fixed   uint AddressOfIndex;
    public   fixed   uint AddressOfCallBacks;
    public   fixed   uint SizeOfZeroFill;
    public   fixed   uint Characteristics;
} 然后我想把Buffer转成IMAGE_TLS_DIRECTORY32类型,比如我定义一个 IMAGE_TLS_DIRECTORY32 strctA;
想把Buffer的内容赋给strctA然后通过strctA.StartAddressOfRawData 来给一些变量赋值这可以做到吗?怎么做?我不会写C#代码,有哪位朋友能提供帮助。。

解决方案 »

  1.   


    using (BinaryReader br = new BinaryReader(File.Open(fileName, FileMode.Open)))
                    {
                        uint StartAddressOfRawData = br.ReadUInt32(); 
        uint EndAddressOfRawData = br.ReadUInt32(); 
        uint AddressOfIndex = br.ReadUInt32(); 
        uint AddressOfCallBacks = br.ReadUInt32(); 
        uint SizeOfZeroFill = br.ReadUInt32(); 
        uint Characteristics = br.ReadUInt32();                 }
    试试看行不
      

  2.   

                byte[] _LoadBytes;   //Load Bytes 获取你的Buffer            int _StuctSize = Marshal.SizeOf(typeof(IMAGE_TLS_DIRECTORY32));
                IntPtr _StructIntPtr = Marshal.AllocHGlobal(_StuctSize);
                Marshal.Copy(_LoadBytes, 0, _StructIntPtr, _StuctSize);
                object _StructObject = Marshal.PtrToStructure(_StructIntPtr, typeof(IMAGE_TLS_DIRECTORY32));
                Marshal.FreeHGlobal(_StructIntPtr);            IMAGE_TLS_DIRECTORY32 _Image = (IMAGE_TLS_DIRECTORY32)_StructObject;
      

  3.   

    直接声明用指针最简单.
    如果不能unsafe,就改用Marshal
    这个比较麻烦,得先用Marshal的Alloc*申请一块非托管内存,
    然后用Marshal.Copy把缓冲区复制过去,然后调用Marshal.PtrToStructure
    生成结构体,最后再用Marshal.Free*释放申请的内存.