托管与非托管数据转换方法之C#设计笔记(十三)

12 篇文章 0 订阅

一、定义结构体到bytes的打包与解包类
public class DataPack
{
public static int PTRSize
{
get
{
int []a= new int[]{};
return Marshal.SizeOf(a);
}
}
#region 结构体到数组
/结构体到数组/
public static byte[] ToBytes(object structObj)
{
if (structObj is IStruct)
{
return (structObj as IStruct).ToBytes();
}
/得到结构体的大小/
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;
}
/结构体数组到byte数组/
public static byte[] ToBytes(T[] structObjArray)
{
//得到返回bytes流的大小
byte[] bytes = new byte[0];
foreach (object obj in structObjArray)
{
bytes = DataPack.CombineByte(bytes, ToBytes(obj));
}
return bytes;
}
///
/// byte数组转结构体
///
public static T ToStruct(byte[] bytes, ref int position)
{
return (T)ToStruct(bytes, typeof(T), ref position);
}
///
/// byte数组转结构体
///
public static T ToStruct(byte[] bytes)
{
int position = 0;
return ToStruct(bytes, ref position);
}
public static object ToStruct(byte[] p, Type StructType)
{
int position = 0;
return ToStruct(p, StructType, ref position);
}
public static object ToStruct(byte[] bytes, Type type, ref int position)
{
object obj = Activator.CreateInstance(type);
if (obj is IStruct)
{
(obj as IStruct).FromBytes(bytes, ref position);
return obj;
}
else
{
/得到结构体的大小/
int size = Marshal.SizeOf(obj);
/分配结构体大小的内存空间/
IntPtr structPtr = Marshal.AllocHGlobal(size);
/将byte数组拷到分配好的内存空间/
Marshal.Copy(bytes, position, structPtr, size);
/将内存空间转换为目标结构体/
obj = Marshal.PtrToStructure(structPtr, type);
/释放内存空间/
Marshal.FreeHGlobal(structPtr);
position += size;
}
return obj;
}
#endregion
public static byte[] CombineByte(byte[] bytes1, params byte[][] bytesarray)
{
byte[] totalBytes = new byte[bytes1.Length + bytesarray.Sum(p => p.Length)];
Array.ConstrainedCopy(bytes1, 0, totalBytes, 0, bytes1.Length);
int index = bytes1.Length;
foreach (var item in bytesarray)
{
Array.ConstrainedCopy(item, 0, totalBytes, index, item.Length);
index += item.Length;
}
return totalBytes;
}
/多个字符数组转结构体数组/
public static T[] ToArray(byte[] bytes, ref int position, int Count)
{
T[] structs = new T[Count];
for (int i = 0; i < Count; i++)
{
structs[i] = DataPack.ToStruct(bytes, ref position);
}
return structs;
}
public static T[] ToArray(byte[] bytes, uint bufferLength)
{
int position = 0;
return ToArray(bytes, ref position, (int)(bufferLength/ Marshal.SizeOf(typeof(T))));
}
}
#endregion
二、结构体与二进制文件之间数据交换
#region 拓扑和文件的转换
public class FileTopoConvert
{
public static DataStruct_t FiletoTopomatStruct(string filename)
{
DataStruct_t dataStruct = new DataStruct_t ();
byte[] bytes = File.ReadAllBytes(filename);
int position = 0;
dataStruct .FromBytes(bytes,ref position);
return dataStruct ;
}
public static bool DataStructToFile(string filename, ref DataStruct_t dataStruct )
{
byte[] bytes = dataStruct .ToBytes();
if (bytes.Length == 0)
{
return false;
}
File.WriteAllBytes(filename, bytes);
return true;
}
}
#endregion
三、结构体与类对象关联
1、如类
public class Student
{
public int age{get;set;}
public string name{get;set;}
}
2、结构体数据转换给到对象属性
Student st=new Student ();
st.age=dataStruct.age;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值