周朔鵬

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace ServerSocket
{
///
/// 記憶體處理,組織記憶體拓撲結構並定義處理函式
/// 作者:周朔鵬
/// 編寫時間:2010-6-10
///
public static class PLCStruct
{
//將結構體聲明為Struct和class其行為完全一致,但是Struct中不能用new創建對象,class中可以,但是,在此套用中創建對象沒有實際價值。
/*[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class Socket_struct
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public byte[] bByte;// = new byte[20];
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public Int32[] dwDword;// = new UInt32[20];
}*/
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct Socket_struct
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public byte[] bByte;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public Int32[] dwDword;
}
}
public class StructToFromByte
{
public static object BytesToStuct(byte[] bytes, Type type)
{
//得到結構體的大小
int size = Marshal.SizeOf(type);
//byte數組長度小於結構體的大小
if (size > bytes.Length)
{
//返回空
return null;
}
//分配結構體大小的記憶體空間
IntPtr structPtr = Marshal.AllocHGlobal(size);
//將byte數組拷到分配好的記憶體空間
Marshal.Copy(bytes, 0, structPtr, size);
//將記憶體空間轉換為目標結構體
object obj = Marshal.PtrToStructure(structPtr, type);
//釋放記憶體空間
Marshal.FreeHGlobal(structPtr);
//返回結構體
return obj;
}
//結構體複製入byte數組
public static byte[] StructToBytes(object structObj)
{
//得到結構體的大小
int size = Marshal.SizeOf(structObj);
//創建byte數組
byte[] bytes = new byte[size];
//分配結構體大小的記憶體空間
IntPtr structPtr = Marshal.AllocHGlobal(size);
//將結構體拷到分配好的記憶體空間
Marshal.StructureToPtr(structObj, structPtr, false);
//從記憶體空間拷到byte數組
Marshal.Copy(structPtr, bytes, 0, size);
//釋放記憶體空間
Marshal.FreeHGlobal(structPtr);
//返回byte數組
return bytes;
}
}
}

相關詞條

熱門詞條

聯絡我們