代码:(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可以和单片机通讯
  

解决方案 »

  1.   

    如果是序列化的话,你可以通过MemoryStream来读取,把如下进行修改:
    stream.Read(Destination, 0, Destination.Length)改成
    stream.Flush();
    Destination = stream.GetBuffer();
      

  2.   

    你的目的不就是转换成byte吗?但是通过sizeof获得大小不一定正确,你直接通过memorystream去读,然后把读过来的buffer赋值给要传送的byte[]即可。
      

  3.   

    我的意思是这样对象转成byte数组后,和用windows api的copymemory 转的是否一样???
      

  4.   

    不要用序列化,单片机不认识的
    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 );
    }
      

  5.   

    主要是你的单片机所能识别的byte是什么样。
      

  6.   

    对sawam(sawam) 表示感谢,但是如果我的结构体里面还包含其它的自定义的结构体行吗?而且如果结构体里面包含了,字符串或是数组怎么办,。net类库里没有好的解决办法吗?
      

  7.   

    c里面直接对内存操作,用指针,我想说的是序列化之后在byte[]中后能不能变成c使用的在内存中的格式
      

  8.   

    你非要在结构体用字符串,数组的话,有个比较麻烦的方法
    比如你有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个字节依次存放,这样不管什么类型的数据都能存放了
      

  9.   

    谢谢你的意思我明白了,这样作可以实现,但是对于和单片机的通讯会有几百种命令,这样的方式,花费太大了,我还是在想,是否有更好的实现方式,况且在。net中使用指针,也有很多的问题尤其对于我这样的菜鸟来说呵呵,还是表示感谢!
      

  10.   

    Lz的程序我看了一下,指几点:
    stream.Read(Destination, 0, Destination.Length) 这句有问题应该在前面加一句,你因该Seek到流的开始处 然后读 。不然会有问题的你测一下!
    tInfo = new byte[Marshal.SizeOf(time[0])]保存在byte[]中对象的长度 一个是SizeOf的长度? MemoryStream 的长度就是数据的长度,应该在函数里面new数组
    lz对问题的关心还是肯定的,对序列化的问题我觉得行不通..很难保证序列化之后再在内存中会是什么样子!可惜啊类库的源码看不到 呵呵,delphi看的到!
      

  11.   

    我讲以下我的看法,在通讯中使用copymemory是有一定的优势的,无论上位机还是单片机都不会在有对数据拆分,对内存进行操作的问题,直接把byte数组用copymemory转换成结构体那样的话,内存中的数据就可以直接使用了,这说明协议有一定的优势比单独规定数据位的意义,如果LZ要把结构体自己写到byte[]中的话要做的工作有多麻烦吗?结构体在内存中存贮不是想象的那样,会对数据有合并,比如char和short两个变量在一起的时候在内存中占4个字节,而不是6个!