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

相关内容

热门资讯

量子淘金APP贵金属投资不合规...   "4元起投""充值返券""月入过万"——这些极具诱惑力的广告语在短视频平台、社交软件上铺天盖地。...
鑫汇智投APP贵金属商品订购骗...   鑫汇智投APP非法期货投资骗局,受害者在投资过程中根本不懂交易,也不去研究和验证这个平台是否正规...
矅光智策APP平台违规经营非法...   矅光智策APP对外宣称是“商城订购”“现货交易”,但查询其经营范围,并未显示具备开展现货期货交易...
黄金珠宝怎么选?内侧刻字都代表... 潮新闻客户端 记者 马焱 通讯员 任倩影 9月8日下午,“云游杭州 乐购金秋”——“浙城·浙放心”活...
原创 冰... 最近全球国债市场正在上演魔幻一幕: 美债、日债、欧债遭遇猛烈抛售,收益率冲到几十年新高,美国财政部都...
日韩股市开盘表现分化 上证报中国证券网讯 9月9日,日韩股市开盘表现分化,韩国综合指数开盘上涨0.26%,报6972.87...
国际原油拉升,中曼石油涨超8%... 9月8日,油气开采及服务板块持续走高, 中曼石油(603619.SH)涨超8%, 石化油服(6008...
宁波银行启动2026年金融教育... 9月7日至13日,宁波银行开展2026年金融教育宣传周。此次活动紧扣“清朗金融网络 守护安心消费”主...
食物发芽后都有毒吗?哪些不能吃... 不少家庭囤放的食材放置一段时间后,悄悄长出了“小芽”。提到食物发芽,大多数人会认为“发芽的食物一般都...
3年9700万美元!骑士官宣与... 搜狐体育消息,北京时间9月9日,骑士官方今日宣布,球队已与哈登续签了一份多年期合同。 骑士官方写道...
农行工行定增2600亿 或于年... 记者 胡艳明 国有大行新一轮资本补充方案落地。 2026年9月7日,农业银行(下称“农行”)、工商银...
9月9日每日研选丨超强厄尔尼诺... 超强厄尔尼诺正成为近期农产品板块走强的核心推手。据美国国家海洋和大气管理局(NOAA)预测,2026...
巨头库存告急,美股光学网络携手... 当地时间9月8日,劳动节长假后的首个交易日,美股三大指数同步走低。标普500指数跌0.58%报767...
原创 A... 9月9日,新股市场迎来洛轴股份(301699)的上市交易。恐怕有些中签的股民已经等急了,因为在同一天...
早报美股光通信,逆市大涨;美袭... 宏观新闻 1、习近平同英国首相伯纳姆通电话。习近平祝贺伯纳姆就任英国首相,指出中英是全面战略伙伴,虽...
原创 “... 备受社会关注的“梅姨案”有了最新消息。9月8日下午,“梅姨”案被拐人申聪和父亲申军良及其代理律师面向...
哪些人群适合选择北方地区熏鸡加... 当前国内小成本餐饮赛道发展平稳,熟食类项目因客群覆盖广、投入门槛低、操作难度可控,成为不少创业者的选...
央视报道丨2026年服贸会首批... 央视《新闻联播》(2026年9月7日) 记者:张萍、叶奂 央视《朝闻天下》(2026年9月8日) 记...
原创 美... 近期,国际能源地缘格局迎来重大变动。 美国通过全新合作协议深度切入委内瑞拉石油产业,调整当地多年形成...
住院后突然糊涂?元凶不是年龄,... 住院后突然糊涂,真的是年纪大了么?很多人第一反应是把谵妄归因于年龄,但最近的一项权威研究给出一个更清...