111,094
社区成员




/// <summary>
/// BYTE数组转结构体
/// </summary>
/// <param name="bytes">byte数组</param>
/// <param name="type">结构类型</param>
/// <returns>转换后的结构体</returns>
public static T Byte2Struct<T>(byte[] bytes, Type type, int startIndex) where T : struct
{
//得到结构体的大小
int size = Marshal.SizeOf(type);
//byte数组长度小于结构体的大小
if (size > bytes.Length - startIndex)
{
return default(T);
}
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将byte数组COPY到分配好的内存空间
Marshal.Copy(bytes, startIndex, structPtr, size);
//将内存空间转换为目标结构体
T obj = (T)Marshal.PtrToStructure(structPtr, type);
//free内存空间
Marshal.FreeHGlobal(structPtr);
//返回结构体
return obj;
}
public static void CopyProperty(object fromObj, object toObj)
{
Type fromType = fromObj.GetType();
Type toType = toObj.GetType();
PropertyInfo[] fromPis = fromType.GetProperties();
PropertyInfo[] toPis = toType.GetProperties();
foreach (PropertyInfo pi in fromPis)
{
PropertyInfo toProperty = toType.GetProperty(pi.Name);
if (toProperty != null)
{
toProperty.SetValue(toObj, pi.GetValue(fromObj, null), null);
}
}
}
/// <summary>
/// 结构体转BYTE数组
/// </summary>
/// <param name="structObj">要转换的结构体</param>
/// <returns>转换后的BYTE数组</returns>
public static byte[] Struct2Bytes<T>(T structObj) where T : struct
{
//得到结构体大小
int size = Marshal.SizeOf(structObj);
//创建byte数组
byte[] bytes = new byte[size];
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将结构体COPY到分配好的内存空间
Marshal.StructureToPtr(structObj, structPtr, false);
//从内存空间COPY到BYTE数组
Marshal.Copy(structPtr, bytes, 0, size);
//free 内存空间
Marshal.FreeHGlobal(structPtr);
//返回byte数组
return bytes;
}
// Create a hashtable of values that will eventually be serialized.
Hashtable addresses = new Hashtable();
addresses.Add("Jeff", "123 Main Street, Redmond, WA 98052");
addresses.Add("Fred", "987 Pine Road, Phila., PA 19116");
addresses.Add("Mary", "PO Box 112233, Palo Alto, CA 94301");
// To serialize the hashtable and its key/value pairs,
// you must first open a stream for writing.
// In this case, use a file stream.
FileStream fs = new FileStream("DataFile.dat", FileMode.Create);