void createFrame(UChar *buffer,UShort length)
{
UShort num;
UShort i,j;
MINISDH_MSG_STRUCT   *msg_ptr;
        
if((frameCtrlData.tempNum+length)>=4000)
    return;
memcpy(&frameCtrlData.tempFrame[frameCtrlData.tempNum],buffer,length);
frameCtrlData.tempNum+=length;
num=frameCtrlData.tempNum;

for(i=0;i<num;i++)
{
    if(i<num-1&&frameCtrlData.New_Frame==0&&
        frameCtrlData.tempFrame[i]==0x80&&frameCtrlData.tempFrame[i+1]==0x70)
    {
        frameCtrlData.W_Ptr=i;
        frameCtrlData.L_Ptr=0;
        frameCtrlData.New_Frame=1;
    }
    else if(i<num-1&&frameCtrlData.New_Frame==1&&
        frameCtrlData.tempFrame[i]==0x80&&frameCtrlData.tempFrame[i+1]==0x70)
    {
     if((frameCtrlData.L_Ptr+1)>=7)
     {
         msg_ptr=(MINISDH_MSG_STRUCT*)(&frameCtrlData.tempFrame[frameCtrlData.W_Ptr]);
    if((msg_ptr->len[0]*256+msg_ptr->len[1]+7)==(frameCtrlData.L_Ptr+1)
     &&(msg_ptr->port_num[0]==KB_SDH_MINI))
    {
        /*SendLetterToMail(PID_NET_MAN,PID_SYSMAN,msg_ptr->msg_type,
                         msg_ptr->port_num,msg_ptr->len,msg_ptr->data);*/
         processMiniSdhMsg(msg_ptr);
        frameCtrlData.W_Ptr=i;
             frameCtrlData.L_Ptr=0;
    }
    else if((msg_ptr->len[0]*256+msg_ptr->len[1]+7)>(frameCtrlData.L_Ptr+1))
         {
          frameCtrlData.L_Ptr++;
              if(frameCtrlData.L_Ptr>=MAX_FRAME_LEN)
              {
                  frameCtrlData.W_Ptr=i;
                  frameCtrlData.L_Ptr=0;
                  frameCtrlData.New_Frame=0;
              }
         }
         else
         {
          frameCtrlData.W_Ptr=i;
              frameCtrlData.L_Ptr=0;
         }
         
}
else
{
         frameCtrlData.W_Ptr=i;
         frameCtrlData.L_Ptr=0;
     }

    }
    else if(i<num-1&&frameCtrlData.New_Frame==1)
    {
     frameCtrlData.L_Ptr++;
     if(frameCtrlData.L_Ptr>=MAX_FRAME_LEN)
     {
         frameCtrlData.W_Ptr=i;
         frameCtrlData.L_Ptr=0;
         frameCtrlData.New_Frame=0;
     }          
    }
    else if(i==num-1&&frameCtrlData.New_Frame==1)
    {
     frameCtrlData.L_Ptr++;
     if(frameCtrlData.L_Ptr>=MAX_FRAME_LEN)
     {
         frameCtrlData.W_Ptr=0;
         frameCtrlData.L_Ptr=0;
         frameCtrlData.New_Frame=0;
         frameCtrlData.tempNum=0;
         break;
     }
    
                if((frameCtrlData.L_Ptr+1)>=7)
                {
                    msg_ptr=(MINISDH_MSG_STRUCT*)(&frameCtrlData.tempFrame[frameCtrlData.W_Ptr]);
    if((msg_ptr->len[0]*256+msg_ptr->len[1]+7)==(frameCtrlData.L_Ptr+1))
    {
        /*SendLetterToMail(PID_NET_MAN,PID_SYSMAN,msg_ptr->msg_type,
                         msg_ptr->port_num,msg_ptr->len,msg_ptr->data);*/
      if(msg_ptr->port_num[0]==KB_SDH_MINI)
     processMiniSdhMsg(msg_ptr);
                      frameCtrlData.tempNum=0;
                    }
                    else
                    {
                        memcpy(frameCtrlData.tempFrame,&frameCtrlData.tempFrame[frameCtrlData.W_Ptr],
                                                        frameCtrlData.L_Ptr+1);
                        frameCtrlData.tempNum=frameCtrlData.L_Ptr+1;
                    }                    
                }
                else
                {
                    memcpy(frameCtrlData.tempFrame,&frameCtrlData.tempFrame[frameCtrlData.W_Ptr],
                                                    frameCtrlData.L_Ptr+1);
                    frameCtrlData.tempNum=frameCtrlData.L_Ptr+1;
                }
                
                frameCtrlData.W_Ptr=0;
                frameCtrlData.L_Ptr=0;
                frameCtrlData.New_Frame=0;
                break;
    }
    else if(i==num-1&&frameCtrlData.New_Frame==0&&
                      frameCtrlData.tempFrame[i]==0x80)
    {
     frameCtrlData.tempFrame[0]=0x80;
                frameCtrlData.tempNum=1;
                frameCtrlData.W_Ptr=0;
                frameCtrlData.L_Ptr=0;
                frameCtrlData.New_Frame=0;
                break;
    }
    else if(i==num-1&&frameCtrlData.New_Frame==0&&
                      frameCtrlData.tempFrame[i]!=0x80)
    {
     frameCtrlData.W_Ptr=0;
                frameCtrlData.L_Ptr=0;
                frameCtrlData.New_Frame=0;
                frameCtrlData.tempNum=0;
                break;
    }
}

}这是我在VxWork端实现代码,但是也不理想,效率不高

解决方案 »

  1.   

    private void createFrame(byte[] indata,int count,String ip){
        int li_start =0;
        int li_end =0;
        int li_CommandLength =0;
        int index=0;
        for(int i=2 ;i<count;i++){
          byte a1=indata[i];
          byte a0=indata[i-1];
          boolean b0=(i ==count-1) || (a1 == Command.PID_NET_MAN && a0 ==Command.PID_SYSMAN );
          if(b0){
             boolean b1=(i ==count-1) && !(a1 == Command.PID_NET_MAN && a0 ==Command.PID_SYSMAN );
             if(i == count-1 && b1)
                 li_end = i;
             else
                 li_end = i - 2;
             li_CommandLength = li_end - li_start+1;
             byte[] OneCommandArray=new byte[li_CommandLength];
             for(int j = 0 ;j< li_CommandLength;j++){
                 OneCommandArray[j] = indata[li_start];
                 li_start = li_start + 1;
             }
             li_start = li_end + 1;
             createCommand(OneCommandArray,ip);
         }
        }
      }
    }这是我在JAVA端的实现,更不理想,如果data[]数据中有sender+receiver(指令头),指令就会被分为两条指令!
      

  2.   

    不要用byte[]直接去找,要用Stream流的办法。
      

  3.   

    Stream流查找??呵呵,老兄的建议真是太伟大了,不过好象有点离题了,哈~~~~~
      

  4.   

    要求在一个长度已知的数据缓冲中取得符合上述数据格式的数据。需要注意的是,在
    data[]的数据里也有可能有sender+receiver(指令头)的数据(概率不是很大),另外,数据缓冲的数据是很乱的,除了符合指令格式的数据之外,还有有很多无意义的乱码。问你几个基本问题:
      1. 无意义的代码要不要处理??
         如何判断无意义的代码?
         是否只要是头两个字节内只要包含  
          public static final byte  PID_NET_SENDER = -128 ; //网管
          public static final byte  PID_RECEIVE = 112 ;     //主控程序
      就认为是有效字节流??  2. 会不会出现 
       sender 的信息里面 夹杂 receive 的信息??   楼上说的没有错啊,可以使用 STREAM 啊!!
       发现 send,或者 receive 后,
       读指定的长度 byte 到 byte 数组中啊!--长度不是都发送过来了吗??
       
      希望你能把处理的细节说的更清楚一些?
      

  5.   

    呵呵,谢谢了,虽然没什么帮助,但还是谢谢两位了,特别是 hesi726(hesi) 咳,因为data[]里面有可能有sender+receiver,所以不可能有将有效数据完全分离的方法,因为指令的结构本身有缺陷,而且数据算法不能过于复杂,因为太复杂的计算系统无法承受。