CSDN-CSDN社区-.NET技术-C#

收藏 跪求C#下如何实现自定义结构或类与BYTE数组之间的相互转换(即数据的打包与解包)?[问题点数:100]

  • danelmo
  • 等 级:
  • 结帖率:
楼主发表于:2008-05-10 16:56:04
请教C#下如何实现自定义结构或类与BYTE数组之间的相互转换(即数据的打包与解包)?
  在C#定义类似如下的结构和类:
[Serializable]
    [StructLayout(LayoutKind.Sequential, Pack = 1)] 
    public struct STCord
    {
        public double x;      //
        public double y;       
        public byte  type;
public int  num;
    };
    [Serializable]
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public class STPara
    {
        public byte type1;        //
        public int[] fre = new int[5];            //       
        public byte type2;      //     
    };   
    [Serializable]
    [StructLayout(LayoutKind.Sequential, Pack = 1)] // 
    public class STChar
    {
        public byte num;          // 
        public double Time;                    // 
        public STCord Pos;        //         
        public int Pw;                        //
        public STPara Para;          //       
        public byte type;      //
        public STTargetCharacter()
        {
            Para= new STPara();           
        }
    };   
在VC6中定义的结构为:
    struct STCord
    {
        double x;      //
        double y;       
        byte  type;
        int  num;
    };

    struct STPara
    {
        public byte type1;        //
        public int fre[5];            //       
        public byte type2;      //     
    };   
    struct STChar
    {
        byte num;          // 
        double Time;                    // 
        STCord Pos;        //         
        int Pw;                        //
        STPara Para;          //       
        byte type;      //       
    };
VC6中定义: STChar stDataVC6,BYTE数组: BYTE bufVC6[1024];
VS2005中定义:STChar stDataVS05=new STChar(); BYTE bufVS05=new BYTE[1024];
如果是VC6与VC6之间利用UDP/TCP进行数据传输,则只需要将stDataVC6与收到的BYTE数组bufVC6利用memcpy指令进行转换就可得到所

要的数据;现在需要C#与VC6之间利用UDP/TCP进行数据传输,该如何将stDataVS05转换为BYTE数组,以便VC6中利用memcpy指令就可以解包得到所

要的数据,VS2005收到VC6发送来的BYTE数组,在VS2005下有该如何将接收到的BYTE数组转换为对应的数据?谢谢!
回复次数:4
  • gomoku用户头像
  • gomoku
  • (IDynamicObject)
  • 等 级:
#1楼 得分:0回复于:2008-05-10 17:10:34

System.Runtime.InteropServices.Marshal.PtrToStructure;
System.Runtime.InteropServices.Marshal.StructureToPtr;


  • gomoku用户头像
  • gomoku
  • (IDynamicObject)
  • 等 级:
#2楼 得分:0回复于:2008-05-10 17:17:26
C# code
[StructLayout(LayoutKind.Sequential, Pack = 1)] public struct STPara { public byte type1; [MarshalAs(UnmanagedType.ByValArray, SizeConst=5)] //<--- public int[] fre; public byte type2; }; static void Main() { byte[] received = ...; GCHandle gch = GCHandle.Alloc(received, GCHandleType.Pinned); STPara st = (STPara)Marshal.PtrToStructure(gch.AddrOfPinnedObject(), typeof(STPara)); gch.Free(); }
#3楼 得分:0回复于:2008-05-12 14:36:58
引用 1 楼 gomoku 的回复:

System.Runtime.InteropServices.Marshal.PtrToStructure;
System.Runtime.InteropServices.Marshal.StructureToPtr;
  • llx529用户头像
  • llx529
  • (白日梦)
  • 等 级:
#4楼 得分:0回复于:2008-05-20 15:34:38
        /// <summary>
        /// 将对像序列化为Byte数组
        /// </summary>
        /// <param name="obj">对像 </param>
        /// <returns>Byte() </returns>
        public byte[] ChangeObjectToByte(object obj)
        {
            //序列化对象
            BinaryFormatter binaryFormatter = new BinaryFormatter();
            //创建一个内存流,序列化后保存在其中
            MemoryStream ms = new MemoryStream();
            //将obj对象(里面保存了所有的用户扩展信息)序列化为内存流
            binaryFormatter.Serialize(ms, obj);
            //设置内存流的起始位置
            ms.Position = 0;
            //读入到 byte 数组
            byte[] b = new byte[ms.Length];

            ms.Read(b, 0, b.Length);
            ms.Close();
            return b;
        }