Подтвердить что ты не робот

Проверка равенства для двух байтовых массивов

Я проверяю равенство двух байтовых массивов, и мне нужна помощь, потому что у меня есть false, даже если массивы должны быть равны.

В рамках моего отладки я мог видеть, что оба из a1 и b1 равны, но он не входит в цикл while для увеличения i.

public bool Equality(byte[] a1, byte[] b1)
{
    int i;
    bool bEqual;
    if (a1.Length == b1.Length)
    {
        i = 0;
        while ((i < a1.Length) && (a1[i]==b1[i]))
        {
            i++;
        }

        if (i == a1.Length)
        {
            bEqual = true;
        }
    }
    return bEqual;
}

Это всегда возвращает false: (a1[i]==b1[i]).

4b9b3361

Ответ 1

Вам нужно где-то добавить возвращаемое значение. Это должно работать:

public bool Equality(byte[] a1, byte[] b1)
{
   int i;
   if (a1.Length == b1.Length)
   {
      i = 0;
      while (i < a1.Length && (a1[i]==b1[i])) //Earlier it was a1[i]!=b1[i]
      {
          i++;
      }
      if (i == a1.Length)
      {
          return true;
      }
   }

   return false;
}

Но это намного проще:

return a1.SequenceEqual(b1);

В качестве альтернативы вы можете использовать IStructuralEquatable из .NET 4:

return ((IStructuralEquatable)a1).Equals(b1, StructuralComparisons.StructuralEqualityComparer)

Ответ 2

Чтобы проверить равенство, вы можете просто написать:

var areEqual =  a1.SequenceEqual(b1);

Ответ 3

Я бы рекомендовал короткое замыкание, чтобы сделать вещи немного проще, и использовать object.ReferenceEquals для короткого замыкания для случаев, когда массивы являются одной и той же ссылкой (a1 = b1):

public bool Equality(byte[] a1, byte[] b1)
{
    // If not same length, done
    if (a1.Length != b1.Length)
    {
        return false;
    }

    // If they are the same object, done
    if (object.ReferenceEquals(a1,b1))
    {
        return true;
    }

    // Loop all values and compare
    for (int i = 0; i < a1.Length; i++)
    {
        if (a1[i] != b1[i])
        {
            return false;
        }
    }

    // If we got here, equal
    return true;
}

Ответ 4

Это должно работать:

public bool Equality(byte[] a1, byte[] b1)
{
   if(a1 == null || b1 == null)
       return false;
   int length = a1.Length;
   if(b1.Length != length)
      return false;
   while(length >0) {
       length--;
       if(a1[length] != b1[length])
          return false;           
   }
   return true;        
}

Ответ 5

Вы должны добавить некоторые операторы возврата:

public bool Equality(byte[] a1, byte[] b1)
{
    int i = 0;
    if (a1.Length == b1.Length)
    {
        while ((i < a1.Length) && (a1[i]==b1[i]))
        {
            i++;
        }
    }
    return i == a1.Length;
}

Или, еще лучше

public bool Equality(byte[] a1, byte[] b1)
{
    if(a1.Length != b1.Length)
    {
        return false;
    }

    for (int i = 0; i < a1.Length; i++)
    {
        if (a1[i] != b1[i])
        {
            return false;
        }
    }
    return true;
}