当前位置:编程学习 > wap >>

100分------------求java算法 如何在字节流中是否含有指定的四个字节呢

需求描述:

 每次从字节流中读取1001个字节的数据,并将数据存放在一个byte[1001] buffer中。


  如何循环buff,判断该缓冲区中是否含有“0x00,0x00,0x00,0x01"这个四个字节的数据呢?(数据流中肯定会有这四个字节的数据的)

算法效率越高越好哦,毕竟是在手机中运行的。

谢谢。 --------------------编程问答--------------------

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%以上的效率了。 --------------------编程问答-------------------- Toast输出的部分可以无视。测试用的 --------------------编程问答--------------------
引用 1 楼 matrixcl 的回复:
Java code
?



123456789101112131415161718192021222324252627282930313233343536373839404142434445464748

private void ReadPic(){     try{            InputStream in = getResources().openRawResour……


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

补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,