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输出的部分可以无视。测试用的 --------------------编程问答--------------------
找到“0x00,0x00,0x00,0x01"之后还没有算完,然后需求跳过18个字节,继续查找“0xFF,0xD8,0xFF,0xE0"标记,找到这些内容之后,再判断接下来的两个字节是否是”0x00,0x00“是的的话则收集数据,否的话 继续循环。
补充:移动开发 , Android