代码:(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可以和单片机通讯
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# 传输 压缩
- 可以在tabcontrol控件的第一页前加一页的吗
- 如何用"buttoni"的形式描述像button1,button2这样的名字?
- C# 写了一个类似飞信的WinForm程序,现在公司要求挪动手机上去,请问
- 请问一下有没有语句可以使得tabControl打开的时候显示的不是tabPage1,就是显示其他的tabPage?
- 苯熊问题:建立一个webform,就放了一个label控件,但是没有办法运行,报"未能加载类application.global",怎么回事???
- 这样的显示图片该怎么做?
- 框架程序---简单的,散分的!
- 如何把文件写到别的机器上,谢谢
- vc++与c#?
- 使用XmlTextReader读取不规则Xml问题,或修改Stream
- 高手进__关于上位机和单片机协议通讯问题(分不够我再补!)
stream.Read(Destination, 0, Destination.Length)改成
stream.Flush();
Destination = stream.GetBuffer();
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 );
}
比如你有1个结构体
public struct testStruct
{
public Int16 int16Data;
public char[] strData;
}
首先你要弄清楚单片机c语言的这个结构体的内存存放方式
然后你声明1个足够大的byte数组(比如byte[] buffer = new buffer[1024]),存放数据
比如int16Data占2个字节,你把int16Data的2个字节放在buffer的前2个字节,strData从buffer的第3个字节依次存放,这样不管什么类型的数据都能存放了
stream.Read(Destination, 0, Destination.Length) 这句有问题应该在前面加一句,你因该Seek到流的开始处 然后读 。不然会有问题的你测一下!
tInfo = new byte[Marshal.SizeOf(time[0])]保存在byte[]中对象的长度 一个是SizeOf的长度? MemoryStream 的长度就是数据的长度,应该在函数里面new数组
lz对问题的关心还是肯定的,对序列化的问题我觉得行不通..很难保证序列化之后再在内存中会是什么样子!可惜啊类库的源码看不到 呵呵,delphi看的到!