C++中的struct写成文件:

#include "stdafx.h"

struct TestStruct    
{           
    
float f1;           
    
float f2;       
    
short s1;           
    
short s2;           
    
float arrf[8];      
}
;

int _tmain(int argc, _TCHAR* argv[])
{
    FILE 
*stream;
    TestStruct teststruct;
    teststruct.f1
=1.0;
    teststruct.f2
=2.0;
    teststruct.s1
=3;
    teststruct.s2
=4;
    
for(int i=0;i<8;i++)
    
{
        teststruct.arrf[i]
=i;
    }


if( fopen_s( &stream, "fread.out""w+t" ) == 0 )
{
fwrite( 
&teststruct, sizeof( teststruct ), 1, stream );
 fclose( stream );
}

 
else
 printf( 
"File could not be opened " );
    
return 0;
}


对应C++结构在C#声明如下:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
        
struct TestStruct
       
{
            
float f1;
            
float f2;
            
short s1;
            
short s2;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst 
= 8)]
            
float[] arrf;
        }


 读取文件到byte[]:

  FileStream fs = 
                    
new FileStream("fread.out", FileMode.Open, FileAccess.Read);
            BinaryReader r 
= new BinaryReader(fs);
            
byte[] b = r.ReadBytes((int)fs.Length);
            r.Close();
            fs.Close();

把byte[] 转换成TestStruct:

 private static TestStruct GetTestStruct(byte[] b)
        
{

            IntPtr intprt 
= 

                  GCHandle.Alloc(b, GCHandleType.Pinned).AddrOfPinnedObject();
            
int isize = Marshal.SizeOf(typeof(TestStruct));
            TestStruct t 
= 
                  (TestStruct)Marshal.PtrToStructure(intprt, 
typeof(TestStruct));

            Marshal.FreeHGlobal(intprt);
            
return t;

        }

 

 


 

 

posted on 2007-07-12 18:04  yuyk  阅读(932)  评论(0编辑  收藏  举报