需求描述: 每次从字节流中读取1001个字节的数据,并将数据存放在一个byte[1001] buffer中。
  如何循环buff,判断该缓冲区中是否含有“0x00,0x00,0x00,0x01"这个四个字节的数据呢?(数据流中肯定会有这四个字节的数据的)算法效率越高越好哦,毕竟是在手机中运行的。谢谢。

解决方案 »

  1.   


    private void ReadPic(){
    try{   
    InputStream in = getResources().openRawResource(R.raw.app704);
    boolean bRet = IsContainSpecialChars(in);
    Toast.makeText(this, "" + bRet, Toast.LENGTH_SHORT).show();
    in.close();                 
    }
    catch(Exception e){         
    e.printStackTrace();     
    }  
    }

    // 查找"0x00,0x00,0x00,0x01"
    private boolean IsContainSpecialChars(InputStream in){

    try{ 
    byte [] buffer = new byte[1001];
    int nRead = 0;
    int nZeroCount = 0;
    int nClips = 0;
    while ((nRead = in.read(buffer)) > 0){
    nClips++;
    for (int i=0; i<nRead; i++)
    {
    if (buffer[i] == 0x00)
    {
    nZeroCount++;
    }
    else
    {
    if (nZeroCount >= 3 && buffer[i] == 0x01)
    {
    Toast.makeText(this, "found postion:" + ((nClips - 1) * 1001 + i) , Toast.LENGTH_SHORT).show();
    return true;
    }

    nZeroCount = 0;
    }
    }
    }
    }
    catch(Exception e){         
    e.printStackTrace();     
    }  

    return false;
    }
    简单解释一下,你要查找的数据比较特殊,前三个byte相同。
    因此查找的时候记录下连续出现了几个0. 记录方法很简单,变量nZeroCount遇0x00加1,遇非0x00置0.
    遇到0x01时,如果已经连续出现3个或3个以上的0,则返回true。这个效率肯定没问题,只遍历了一遍。任何优化都不大可能提高10%以上的效率了。
      

  2.   

    Toast输出的部分可以无视。测试用的
      

  3.   


    找到“0x00,0x00,0x00,0x01"之后还没有算完,然后需求跳过18个字节,继续查找“0xFF,0xD8,0xFF,0xE0"标记,找到这些内容之后,再判断接下来的两个字节是否是”0x00,0x00“是的的话则收集数据,否的话 继续循环。