必须byte[] b={1,2,3,4,6,0,4,6};
需要查找的是bte[] bb={4,6};
类似字符窜查找indexof的。
怎么最快的查找?

解决方案 »

  1.   

              public  int GetIndexOf(byte[] b, byte[] bb)
            {
                if (b == null || bb == null || b.Length == 0 || bb.Length == 0)
                    return -1;            int i, j;
                for (i = 0; i < b.Length; i++)
                {
                    if (b[i] == bb[0])
                    {
                        for (j = 1; j < bb.Length; j++)
                        {
                            if (b[i + j] != bb[j])
                                break;
                        }
                        if (j == bb.Length)
                            return i;
                    }
                }
                return -1;
            }//调用代码
      byte[] b = { 1, 2, 3, 4, 6, 0, 4, 6 };
      byte[] bb = { 4, 6 };  int i = GetIndexOf(b, bb);
      

  2.   

    byte[] b={1,2,3,4,6,0,4,6};
    byte[] bb={4,6};
    int query = b.Select((x, i) => new { i, x = b.Skip(i).Take(2) }).FirstOrDefault(x => x.x.SequenceEqual(bb)).i;
      

  3.   

    可以弄个2.0的项目吧。
    设置4.0虽然支持linq,但是我一个方法莫名报错
    api如下
    对 PInvoke 函数“WindowsFormsApplication1!WindowsFormsApplication1.Api::VirtualQueryEx”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
      

  4.   

    和这个问题无关。
    你的api声明可能有问题。
      

  5.   

     byte[] b = { 1, 2, 3, 4, 6, 0, 4, 6 };
                byte[] bb = { 4, 6 };
                var i = b.Select((t, index) => new { t = t, index = index }).FirstOrDefault(t => b.Skip(t.index).Take(bb.Length).SequenceEqual(bb)).index;
             
      

  6.   


    改这样就不越界了   public int GetIndexOf(byte[] b, byte[] bb)
            {
                if (b == null || bb == null || b.Length == 0 || bb.Length == 0 || b.Length<bb.Length)
                    return -1;            int i, j;
                for (i = 0; i < b.Length - bb.Length + 1; i++)
                {
                    if (b[i] == bb[0])
                    {
                        for (j = 1; j < bb.Length; j++)
                        {
                            if (b[i + j] != bb[j])
                                break;
                        }
                        if (j == bb.Length)
                            return i;
                    }
                }
                return -1;
            }