问题是这样的,做一个Socket程序,客户端用的C++,服务器端用C#,两边都定义了相同的结构体,问题如何把C#的结构体转换成byte[]发送到客户端,还有就是,如何把客户端发送过来的byte[]转换成一个结构体?希望有做过这方面程序的朋友给点提示!

解决方案 »

  1.   

    将你的结构体前面加上属性Serializable,然后用BinaryFormatter类序列化和反序列化。
      

  2.   

    我试试!谢谢你!
    那byte[]转换成struct如何做呢?
      

  3.   

    BinaryFormatter 序列化后的数据还是会包含额外信息,不仅仅是结构体的内容而已。
      

  4.   

    将结构体对象序列化成一个XML文件,然后传输后,在接收方再转换回来.
      

  5.   

    我明白楼主的意思了。
    你可以尝试这样:public struct MyStruct
    {
    int i;
    int j;
    }unsafe byte[] SaveMyStruct(MyStruct* st)
    {
    int len = sizeof(MyStruct);
    MessageBox.Show(len.ToString());
    byte[] buf = new byte[len];
    byte* p = (byte*)st;
    for (int i=0; i<len; i++)
    {
    buf[i] = *p++;
    }
    return buf;
    }private void button1_Click(object sender, System.EventArgs e)
    {
    MyStruct st = new MyStruct();
    unsafe
    {
    byte[] buf = SaveMyStruct(&st);
    MessageBox.Show(buf.Length.ToString());
    }}
      

  6.   

    OBJECT对象序列化转换为byte[] byte[]反序列化转换为OBJECT对象 
    http://www.cnblogs.com/contlu/archive/2005/01/19/94178.html
     '参考:http://blog.csdn.net/freehul/archive/2005/01/19/258787.aspx
        '将Image对象和byte[]互相转换 
        Public Shared Function ReadObject()Function ReadObject(ByVal obj As Object) As Byte()
            Dim ms As MemoryStream = New MemoryStream
            Dim bf As BinaryFormatter = New BinaryFormatter
            bf.Serialize(ms, obj)
            ms.Close()
            Return ms.ToArray()
        End Function    Public Shared Function GetObject()Function GetObject(ByVal bytes As Byte()) As Object
            Dim ms As MemoryStream = New MemoryStream(bytes, 0, bytes.Length)
            Dim bf As BinaryFormatter = New BinaryFormatter
            Return bf.Deserialize(ms)    End Function
      

  7.   

    如果发送端和接收端都是 .NET 应用程序,用序列化比较方便,而且不用接触到 Marshal 或 unsafe 代码。虽然序列化的数据里会包含一些额外的数据,如:程序集名称、版本、公钥等,看似冗余,其实对版本控制是有好处的。不过楼主已经说得很明白了,客户端是 C++,服务端是 C#,那用序列化就不是很现实了,除非是用 VC.NET 并使用托管代码,这样的情况可以参考这篇帖子:
    http://community.csdn.net/Expert/topic/3466/3466293.xml?temp=.6052515可以“比较”完美得实现 struct <-> byte[] 的互相转换。
      

  8.   

    那byte[]转换成struct如何做呢?--->那应该是自己手工拼凑了吧,你知道结构体的结构、成员,按顺序一个一个换好了,可以写个转换函数struct mystruct change(byte[] b)
      

  9.   

    unsafe MyStruct ReadMyStruct(byte[] buf)
    {
    MyStruct st = new MyStruct();
    byte* p = (byte*)st;
    int len = sizeof(MyStruct);
    for (int i=0; i<len; i++)
    {
    *p++ = buf[i];
    }
    return st;
    }private void button1_Click(object sender, System.EventArgs e)
    {
    MyStruct st = new MyStruct();
    unsafe
    {
    byte[] buf = SaveMyStruct(st);
    ...
    st = ReadMyStruct(buf);
    MessageBox.Show(st.i.ToString());
    }}
      

  10.   

    如果效率不是问题的话,何不用xml来交换数据?
      

  11.   

    不能用序列化,序列化后包含无用信息!应该使用非托管方式
    参考,Structertoptr 和 ptrtoStructer函数
      

  12.   

    其实序列化也有麻烦.
    如果结构数据不是太多太复杂,
    有个比较实际的办法,就是自己手动序列.
    自己写几个解编函数,把结构中的基础数据转换为BYTE[]队列,再才传输就可以了.