需求:1、需要在客户端用C#处理(解包)来自C++服务器传入的二进制数据流;数据流通过socket通讯传入的;
2、服务器端的数据格式定义是 std::vector<uint8> _storage;
3、需要在C#客户端对数据进行打包,再转到二进制流,传给服务器端;通信层面已经完成了,但如何用C#对这种数据进行打包和解包?请教高手啊。
2、服务器端的数据格式定义是 std::vector<uint8> _storage;
3、需要在C#客户端对数据进行打包,再转到二进制流,传给服务器端;通信层面已经完成了,但如何用C#对这种数据进行打包和解包?请教高手啊。
2、服务器端的数据格式定义是 std::vector<uint8> _storage;
3、需要在C#客户端对数据进行打包,再转到二进制流,传给服务器端;通信层面已经完成了,但如何用C#对这种二进制数据进行打包和解包?请教高手啊。
2、服务器端的数据格式定义是 std::vector<uint8> _storage;
3、需要在C#客户端对数据进行打包,再转到二进制流,传给服务器端;通信层面已经完成了,但如何用C#对这种二进制数据进行打包和解包?请教高手啊。
再次求教啊
我现在已经研究明白了,其实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;
}总之谢谢大家,给分啦