c#中使用结构体

来源:百度文库 编辑:神马文学网 时间:2024/04/29 01:33:39
//--------------结构体测试代码-------------------------------------
/*原结构体
//zxmenu.bin的文件头结构
typedef struct
{
charMark[8];              //标记(QLZXMENU)
charVersion;              //版本号(0x01)
charreserved1;            //保留
unsignedshortMenuNum;    //菜单数目
charreserved[4];          //保留
}tagZxMenuHead;
*/
public structtagZxMenuHead
{
[MarshalAs(UnmanagedType.ByValTStr,SizeConst = 8)]
public stringMark;
public byteVersion;
public byteReserved1;
public ushortMenuNum;
[MarshalAs(UnmanagedType.ByValTStr,SizeConst = 4)]
public stringReserved;
}
public static bool BytesToStruct(byte[] bytes,ref tagZxMenuHeadHead)
{
int size=  Marshal.SizeOf(Head);
IntPtr buffer =Marshal.AllocHGlobal(size);
try
{
Marshal.Copy(bytes,0, buffer, size);
Head=(tagZxMenuHead)Marshal.PtrToStructure(buffer,Head.GetType());
returntrue;
}
catch
{
Marshal.FreeHGlobal(buffer);
returnfalse;
}
}
static byte[] StructToBytes(tagZxMenuHead structObj)
{
int size=0;
try
{
size=Marshal.SizeOf(structObj);
}
catch (Exception ex)
{
string rr=ex.Message;
}
IntPtr buffer =Marshal.AllocHGlobal(size);
try
{
Marshal.StructureToPtr(structObj, buffer,true);
byte[] bytes = newbyte[size];
Marshal.Copy(buffer, bytes, 0,size);
return bytes;
}
catch(Exception ex)
{
string rr=ex.Message;
return null;
}
finally
{
Marshal.FreeHGlobal(buffer);
}
}