代码:(c#)
tInfo = new byte[Marshal.SizeOf(time[0])]//tInfo初始化 time[]已知,然后调用下面这个方法
public static void CopyMemory(byte[] Destination, tTime[] Source, int Length)
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bFormat = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
System.IO.MemoryStream stream = new System.IO.MemoryStream();
bFormat.Serialize(stream, Source);
stream.Read(Destination, 0, Destination.Length)
stream.Close();
}说明:tTime[] Source是自定义的数据结构;这个是本人模拟windows的copymemory这个api实现把内
存的数据结构存储到byte数组的方法。目的:copymemory不安全,用这个方法实现,把内存的数据结构保存到byte数组(还要对数组进行操作计算校验码),然后通过一个协议封包,通过tcp/ip协议转发到单片机,单片机解析出数据,完成特定的功能。问题:这种方法能不能够把内存中的数据拷贝到byte数组中,变成单片机识别的数据结构,单片机用c
开发的;我这个把对象化为byte数组的方法好不好,有什么好的方法给个建议;或者给说一下
对象序列化是怎样工作的;注: 原来的使用windows的copymemory这个api可以和单片机通讯
网友建议:不要用序列化,单片机不认识的
c#可以用指针把1个结构转换成byte数组。
转换的时候要注意几点
1。结构里不能有数组,类,字符串之类的东西
2. 单片机的字节对齐方式和字节顺序
比如
private unsafe void Test()
{
int test = 0;
int* pint = &test ;byte* pdata = ( byte* ) pint;
int dataLength = sizeof ( int );
byte[] body = new byte[dataLength];
for ( int i = 0; i < body.Length; i++ )
body[ i ] = *( pdata + i );
}
tInfo = new byte[Marshal.SizeOf(time[0])]//tInfo初始化 time[]已知,然后调用下面这个方法
public static void CopyMemory(byte[] Destination, tTime[] Source, int Length)
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bFormat = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
System.IO.MemoryStream stream = new System.IO.MemoryStream();
bFormat.Serialize(stream, Source);
stream.Read(Destination, 0, Destination.Length)
stream.Close();
}说明:tTime[] Source是自定义的数据结构;这个是本人模拟windows的copymemory这个api实现把内
存的数据结构存储到byte数组的方法。目的:copymemory不安全,用这个方法实现,把内存的数据结构保存到byte数组(还要对数组进行操作计算校验码),然后通过一个协议封包,通过tcp/ip协议转发到单片机,单片机解析出数据,完成特定的功能。问题:这种方法能不能够把内存中的数据拷贝到byte数组中,变成单片机识别的数据结构,单片机用c
开发的;我这个把对象化为byte数组的方法好不好,有什么好的方法给个建议;或者给说一下
对象序列化是怎样工作的;注: 原来的使用windows的copymemory这个api可以和单片机通讯
网友建议:不要用序列化,单片机不认识的
c#可以用指针把1个结构转换成byte数组。
转换的时候要注意几点
1。结构里不能有数组,类,字符串之类的东西
2. 单片机的字节对齐方式和字节顺序
比如
private unsafe void Test()
{
int test = 0;
int* pint = &test ;byte* pdata = ( byte* ) pint;
int dataLength = sizeof ( int );
byte[] body = new byte[dataLength];
for ( int i = 0; i < body.Length; i++ )
body[ i ] = *( pdata + i );
}
解决方案 »
- DataGridView的行头三角焦点如何设定
- DateTime.FromOADate的使用
- 为什么无法生成解决方案?
- short[] a=new short a[4];
- 问下大家如何通过C#语言向数据库中的表添加字段?急用,谢谢大家了
- 做一个下载更新版本的功能,如何做其下载进度的显示(帮顶有分,给相关资料连接有分)
- 请问怎么在C#的应用程序里面调用一个url地址
- 如何捕捉别的网站的按钮信息并且模拟人的操作提交。
- 想到北京发展,请各位兄弟姐妹告诉我工资报价
- [请教] .net中PKI实现-关于证书和私钥的问题
- 高手进__关于对象序列化的问题(分不够我再补!)
- 编写smtp程序,设置邮件服务器问题
System.IO.MemoryStream stream = new System.IO.MemoryStream(buf);
stream.Write(data);//依次写入各个数据
//buf中就是你的数据
例如在发送方把“ABC”转换成“123”进行发送,那么接收方接收到“123”能明白发送的内容是“ABC”。否则相当于发送方作无用功。