C#中结构体和字节数组的相互转换

在C++ 中直接可以将文件流读进结构体中,最近换了C#开发发现这种转化在C#中还是比较麻烦的,这里做一个备忘

由二进制流到字节数组再到结构体

      
this.fs = filestream;            //打开一个文件流
fs.Seek(0, SeekOrigin.Begin);    //找到文件头
BinaryReader biReader = new BinaryReader(fs);     //使用二进制读取    
Byte[] buff = new Byte[54];                       //bmp格式是有54个字节的文件头
                                                  //定义一个54大小的byte数组
biReader.Read(buff, 0, 54);                       //将二进制流的前54个字节读取数组中
IntPtr fileHaderPtr = Marshal.AllocHGlobal(14);          //给Ptr分配内存,FileHader是14个字节
Marshal.Copy(buff, 0, fileHaderPtr, 14);                 //将buff中的字节复制到Ptr
      
fileHader = (FileHader)Marshal.PtrToStructure(fileHaderPtr,typeof(FileHader));      
//Ptr内存空间转换为结构体
Marshal.FreeHGlobal(fileHaderPtr);     //释放掉指针

由字节数组到结构体

string outFileName;            //输出文件名称
this.fs = new FileStream(outFileName, FileMode.OpenOrCreate);  //结构体到字节数组
                //new一个文件流对象,使用create模式创建新文件
IntPtr filePtr = Marshal.AllocHGlobal(14);        //bmp格式的FileHader是14字节的,分配一个空间
Marshal.StructureToPtr(this.fileHader,filePtr,false);    //将对象结构体转换为指针指向的内存
Byte[] fileBuff = new Byte[14];                          //新建一个数组用于存放数据
Marshal.Copy(filePtr,fileBuff,0,14);                     //将指针指向内存的内容复制到数组
Marshal.FreeHGlobal(filePtr);                            //释放掉指针

fs.Write(fileBuff, 0, 14);         //将数组中的内容写到文件流中

 

你可能感兴趣的:(C#,c#)