Simple bytearray comparing question.

byte[] a = new byte[2];
byte[] b = new byte[2];
a[0] = 1;
a[1] = 2;
b[0] = 1;
b[1] = 2;
Console.WriteLine( a == b );
a[0] = 1;
a[1] = 2;
b[0] = 2;
b[1] = 2;
Console.WriteLine( a == b);

How can i effeciently compare if the values in a is equal to b ( in my base, the size of array should be more then 1M) ? I want the result to be true false, instead of false false that i get now.
LVL 5
ho_alanAsked:
Who is Participating?
 
TheAvengerCommented:
As you will compare huge arrays, consider the following optimization of the code. Note that you must enable unsafe blocks in the project properties.

unsafe public bool CompareArrays (byte[] first, byte[] second)
{
      if (first.Length != second.Length)
            return false;

      fixed (byte* f = first)
            fixed (byte *s = second)
            {
                  long* p1 = (long*)f;
                  long* p2 = (long*)s;

                  // Compare as much as possible as longs
                  for (int i = 0; i < first.Length / sizeof (long); i++)
                        if (p1[i] != p2[i])
                              return false;

                  // Compare the rest as bytes
                  for (int i = 0; i < first.Length % sizeof (long); i++)
                        if (f[(first.Length / sizeof (long)) * sizeof (long) + i] !=
                              s[(first.Length / sizeof (long)) * sizeof (long) + i])
                              return false;

                  return true;
            }
}

An example usage:
private void button1_Click(object sender, System.EventArgs e)
{
      byte[] a = new byte[10000];
      byte[] b = new byte[10000];

      Random r = new Random();

      for (int i = 0; i < a.Length; i++)
            a[i] = b[i] = (byte)r.Next();

      MessageBox.Show (CompareArrays(a, b).ToString());
}
0
 
testnCommented:
If you use == on reference type, it will compare the pointer instead of the value inside. That's why you got false in both cases
0
 
testnCommented:
This means that to compare them, you have to compare it byte by byte....

    public bool CompareArrays (byte[] first, byte[] second)
    {
        if (first.Length != second.Length)
            return false;
        for (int i=0; i < first.Length; i++)
            if (first[i] != second[i])
                return false;
        return true;
    }
0
Cloud Class® Course: Python 3 Fundamentals

This course will teach participants about installing and configuring Python, syntax, importing, statements, types, strings, booleans, files, lists, tuples, comprehensions, functions, and classes.

 
ho_alanAuthor Commented:
Hi TheAvenger

In my understanding, you are trying to convert the byte array into a long array first, then compare each block of the long array 1 by 1. So.. the looping will be 4 times less? So.. it still need to loop..

Is there a method which is similar to the function memcmp in c++?
0
 
TheAvengerCommented:
Actually it's 8 times faster, because the long type in C# is 8 bytes, byte is 1 byte.

I don't know about such a method, but this does not mean it does not exist....
0
 
TheAvengerCommented:
By the way this loop compares 10 Mb arrays for ~0.5 sec so I think it has a good performance...
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.