托管与非托管数据转换方法之C#设计笔记(十三)
admin
2024-01-29 19:13:34
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;

相关内容

热门资讯

金价会重现2011年暴跌及熊市... 2025年至2026年初,国际金价迎来一波规模空前的上行走势,国际金价自每盎司2500美元/盎司附近...
中国何时做出最强大模型?马斯克... (文/陈济深 编辑/张广凯) 今日,有网友在社交媒体提问称:“中国大模型预计何时能够达到Anthro...
落马市委书记留下33个烂尾工程... 6月18日,最高人民法院发布依法惩治渎职犯罪典型案例,其中提到曹某受贿、滥用职权一案。 据披露,2...
攻击217款银行应用:安卓木马... IT之家 6 月 19 日消息,安全公司 Zimperium 于 6 月 17 日发布博文,报告称其...
原创 免... 编辑 | 虞尔湖 出品 | 于见专栏 微短剧行业在2025年迈过了千亿规模门槛,全年3.3万部新剧...
奥克股份:独立董事任建纲辞任 奥克股份:独立董事任建纲辞任 每经AI快讯,6月18日,奥克股份公告,公司董事会近日收到独立董事任建...
2万亿存款“大迁徙”:当利率“... 一场由低利率和资产比价驱动的财富迁移正在发生,2万亿居民存款在两个月内“搬家”,寻找新的“避风港”。...
马化腾身家暴涨千亿,稳居大湾区... 6月17日,新财富杂志发布2026年中国创富榜500强榜单。榜单显示,以持股市值计算的上榜者总财富达...
大搜车冲刺纳斯达克:拟6月25... 雷递网 雷建平 6月18日 大搜车(DSC Holding,股票代码为:“DSC”)日前开启招股,准...
原创 美... 如果把全球能源市场比作一张大牌桌,那么这一轮中东风暴里最让西方分析师抓狂的,不是哪家产油国突然减产,...
董事长不能兼任集体委主任 股份合作公司在深圳城市发展过程中起到了重要作用,烟火气息浓厚。 南都记者 霍健斌 摄 股份合作公司...
高端GPU供给紧缺,海外算力租... 截至13:16,算力租赁概念午后拉升,科创创业人工智能ETF(588470)上涨4.94%,创业板人...
小红书推广,官方授权服务商怎么... 在当今数字化营销的时代,小红书推广已成为众多企业提升品牌知名度和产品销量的重要手段。然而,面对市场上...
小红书酝酿12年的电商突围战:... 当京东、淘天、抖音在618的牌桌上明争暗斗时,小红书搭起了另一座擂台。 上海静安寺地铁站里,小红书没...
何明医生:怎么判断是不是得了脏... 脏虚证不是某一项化验单上的指标,而是身体整体机能下滑的综合表现。判断是否“脏虚”,关键看症状和持续时...
一箱降12元!胖东来多款热门自... 6月17日,多位网友称,发现胖东来多款网红自营产品悄悄下调了价格,包括果汁、燕麦桶等深受消费者追捧的...
华尔街正向美国监管机构施压 要... 财联社6月18日讯(编辑 周子意)华尔街各机构目前正对美国监管机构施压,认为其实施的“巴塞尔资本规则...
医疗健康领域投融资日报(6月1... 据亿欧数据统计,昨日( 2026年6月17日)共披露 19起投融资事件,涉及 17家国内企业, 2家...
2026四川国际美酒博览会在绵... 6月18日上午,2026四川国际美酒博览会开幕式暨第三届中国酒业“华夏美学”大会在绵竹剑南老街举行。...
6月19日大空头集体开火!3万... 上市三天,市值碾压巴菲特,马斯克登顶万亿富豪。但电影《大空头》的原型们却坐不住了。 2026年6月,...