托管与非托管数据转换方法之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;

相关内容

热门资讯

北京国丹医院刘云涛:女性白癜风... 白癜风是常见的色素脱失性皮肤病,以皮肤白斑为典型表现,可累及全身各部位,严重时影响容貌美观。女性白癜...
高立执掌华润饮料,将如何重构快... 出品|中访网 审核|李晓燕 近期,港交所上市刚满一年的华润饮料迎来关键人事迭代。公司公告显示,执行董...
政策利好加持!商业不动产REI... 上周公募REITs二级市场价格波动下跌。截至上周五(1月16日),中证REITs(收盘)和中证REI...
掌阅科技摇摆的17年 文 | 新立场Pro 手握海量IP,成湘均的梦想是创造第二个“张凌云时代”。 2025年,掌阅迎来...
33.38亿!刘永好实控的新希... 微成都报道日前,新希望(000876.SZ)披露向特定对象发行A股股票方案调整公告,募集资金总额由不...
A股缩量整固,9只基金单日涨超... 1月19日,三大指数涨跌不一,沪指走势较强,创业板指冲高回落。板块来看,电网设备、机器人、旅游酒店和...
2025年保险资管产品图鉴:1... (图片来源:视觉中国) 蓝鲸新闻1月19日讯(记者 陈晓娟)权益市场大年,一众资管产品表现亮眼。记者...
利率下探至“2字头”,经营贷成... 近日,国务院常务会议部署实施财政金融协同促内需一揽子政策,明确优化服务业经营主体贷款和个人消费贷款贴...
“亚洲巴菲特”,大手笔押注黄金 在亚洲投资圈,谢清海的名字,向来与“价值”“耐心”和“长期”等词绑定在一起。 30余年来,他与合伙人...
清华“私募大佬”拟入主这家上市... 然而,这场资本运作却在董事会层面引发分歧,天晟新材昔日第一大股东青岛融海国投资产管理有限公司(下称“...
首批新能源主题基金四季报出炉 ... 证券时报记者 王明弘 目前,公募基金2025年四季度报告正在陆续披露。 首批新能源主题基金披露的四季...
【立方债市通】2025年PPN... 第 542 期 2026-01-19 焦点关注 交易商协会:2025年自律处分143家(人)次...
日本国债延续创纪录下跌步伐 提... 财联社1月19日讯(编辑 史正丞)据央视新闻、新华网等媒体报道,日本首相高市早苗周一举行新闻发布会,...
平安2025年最高赔付超200... 一周新闻速览 监管动态 七部门:开发气象保险产品,研发雷暴哮喘、花粉过敏等保险指数 央行:下调各类结...
金价普遍上扬!2026年1月1... 今日国内金店黄金价格迎来全线反弹,市场呈现普涨态势。其中,老庙黄金单日上涨24元,报1459元/克,...
孙宇晨出价3000万美元欲与马... 近日,90后币圈大佬孙宇晨在X上发帖表示,如果能和马斯克单独聊一个小时,他愿意支付3000万美元。算...
原创 全... 近日,据多家媒体报道,全球第二大啤酒酿造商喜力集团突然宣布其首席执行官多尔夫·范登布林克将于2026...
瑞尔竞达二度闯关北交所终过会,... 在首次因“清仓式”分红折戟、撤回材料仅10天后即再度递表,瑞尔竞达的北交所上市之路一波三折,此番经历...
振幅24.9%、换手34%!纸... 1月19日,延江股份(300658.SZ)复牌首日上演“过山车”行情,开盘股价直冲“20cm”涨停,...