Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 247
  • Last Modified:

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.
0
ho_alan
Asked:
ho_alan
  • 3
  • 2
2 Solutions
 
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
 
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
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
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

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now