需求:1、需要在客户端用C#处理(解包)来自C++服务器传入的二进制数据流;数据流通过socket通讯传入的;
2、服务器端的数据格式定义是 std::vector<uint8> _storage;
3、需要在C#客户端对数据进行打包,再转到二进制流,传给服务器端;通信层面已经完成了,但如何用C#对这种数据进行打包和解包?请教高手啊。

解决方案 »

  1.   

    需求:1、需要在客户端用C#处理(解包)来自C++服务器传入的二进制数据流;数据流通过socket通讯传入的;
    2、服务器端的数据格式定义是 std::vector<uint8> _storage;
    3、需要在C#客户端对数据进行打包,再转到二进制流,传给服务器端;通信层面已经完成了,但如何用C#对这种二进制数据进行打包和解包?请教高手啊。
      

  2.   

    需求:1、需要在客户端用C#处理(解包)来自C++服务器传入的二进制数据流;数据流通过socket通讯传入的;
    2、服务器端的数据格式定义是 std::vector<uint8> _storage;
    3、需要在C#客户端对数据进行打包,再转到二进制流,传给服务器端;通信层面已经完成了,但如何用C#对这种二进制数据进行打包和解包?请教高手啊。
    再次求教啊
      

  3.   

    感谢大家关注我的问题啊。
    我现在已经研究明白了,其实Vector<uint8> 产生交发送过来的数据跟C#里的byte[]数据流是一样的。
    例:vector<uint8>中存储一个int16位的1数据,表现为byte[] a={1,0}
    如同时存放两个数 int16的1和int32的1,则在c#中表现为 byte[] b={1,0,0,0,0,1},这个时间在c#中,要读取这两个数,要一个个来读 先获得前两个元素byte[] b1={1,0},将这个转化为Int16,再获得后四位元素byte[] b2={0,0,0,1}
    用如下方法可将b1,b2转化为Int16,Int32的数据
       private object Read(Type type)
            {
                if (m_storage == null || m_storage.Length <= 0) { return null; }
                //得到结构的大小
                object obj = null;
                try
                {
                    int size = Marshal.SizeOf(type);
                    //byte数组长度小于结构的大小
                    if (size > m_storage.Length)
                    {      //返回空
                        return null;
                    }                IntPtr structPtr = Marshal.AllocHGlobal(size);   //分配结构大小的内存空间
                    Marshal.Copy(m_storage, m_readIndex, structPtr, size);//将byte数组拷到分配好的内存空间
                    obj = Marshal.PtrToStructure(structPtr, type); //将内存空间转换为目标结构
                    Marshal.FreeHGlobal(structPtr);  //释放内存空间            
                    m_readIndex += size;
                }
                catch (Exception ex)
                {
                    Console.Write(ex.ToString());
                    return null;
                }
                //返回结构
                return obj;
            }总之谢谢大家,给分啦