当前位置: 代码迷 >> VC/MFC >> 逻辑思维不够,哪位高手接用下,逻辑太强大了
  详细解决方案

逻辑思维不够,哪位高手接用下,逻辑太强大了

热度:99   发布时间:2016-05-02 03:37:49.0
逻辑思维不够,谁接用下,逻辑太强大了

真心想不好了,我先简单描述案件的过程
我有个4096大的空间,有一天张三要长期在租用.....他存的是单号和物品都是连续在一起的.....

好了进入正题,是这样的,远程不断发送数据
OnReceive 是用别人的模块 pdata 是一次性过来的数据  iLength 是数据长度

远程的数据格式是 头文件5个字节后面是数据紧接又是头文件5个字节后面是数据
这样有时候是一个体(我们这里把 头文件5个字节后面是数据 称为一个)有时候有10个体
他是不固定的但是结构都是一样的 

 由于整体长度不是固定的,所以我没办法定义 buff的大小 所以我只能把pdata4096来切割,或者1024长度切割

 full();  //这个是分析数据
OnReceive(IClient* pClient, const BYTE* pData, int iLength) 这个是切割数据 将切割的数据放入buff里 因为这个是主接受数据的


我现在逻辑上跟不上,不知道怎么去写,我自己想假如数据5000,这时候拷贝4096 还剩余904 ,
而恰好 头文件5个字节后面是数据 取出了 4000个字节 那么还剩下 96个 那这个96个移动到904的前面 重新拷贝到 buff

整体这逻辑上就写不好了,总是写出内存溢出 用 memcpy(buff  ,pData  , 长度 )

求大侠帮我这个思路写下
***.h
char buff[4096];
int m_ncurlen;


***.cpp

EnHandleResult XXXX::OnReceive(IClient* pClient, const BYTE* pData, int iLength)
{
//pData 数据 iLength 长度
m_ncurlen = iLength; //总的数量
memset(buff, 0, 4096);
for (;;) //永无止境的工作
{
//这个是我自己写的,但是总是出错
if ( m_ncurlen >4096 )
{
memcpy(buff, pData  , 4096 );
full();
}else
{
memcpy(buff,pData,长度);
full();
}}

}


full()
{
//这里是处理 buff 的数据 将 头文件5个字节后面是数据 分出来 也是个循环,当buff里数据不足读取的时候退出去,重新拷贝数据到buff里
}




------解决思路----------------------
头文件5个字节后面是数据    你的一个体是否定长?  

不过, 不管定不定长, 你都可以这么来解析.

除了buff,需要另定义一个buff2, 和一个长度len2,    buff2是用来保存不满一个"体"的数据.
每次OnReceive 收到iLength数据后, 

先看buff2中是否有上次不满一个"体"的数据缓存. 如果有, 则把buff2中的数据先复制到buff中, 然后再接收前一个"体"未接收完的数据.

每次从pData复制一个"体"的数据到buff 中,  然后处理一个"体",  直到pData中的数据不足一个体, 则把这些数据缓存到buff2中,并记录长度到len2中, 继续下一次接收.
------解决思路----------------------
我看楼主话都说不清楚,先把话说的没有歧义吧