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

sky123123 2012-09-13 01:16:26
需求描述:

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


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

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

谢谢。
...全文
157 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
sky123123 2012-12-12
  • 打赏
  • 举报
回复
引用 1 楼 matrixcl 的回复:
Java code ? 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 private void ReadPic(){ try{ InputStream in = getResources().openRawResour……
找到“0x00,0x00,0x00,0x01"之后还没有算完,然后需求跳过18个字节,继续查找“0xFF,0xD8,0xFF,0xE0"标记,找到这些内容之后,再判断接下来的两个字节是否是”0x00,0x00“是的的话则收集数据,否的话 继续循环。
matrixcl 2012-09-13
  • 打赏
  • 举报
回复
Toast输出的部分可以无视。测试用的
matrixcl 2012-09-13
  • 打赏
  • 举报
回复

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%以上的效率了。

80,348

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧