Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
Solved

# Simple bytearray comparing question.

Posted on 2003-12-02
Medium Priority
246 Views
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
Question by:ho_alan
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• Learn & ask questions
• 3
• 2

LVL 18

Assisted Solution

testn earned 140 total points
ID: 9863650
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

LVL 18

Expert Comment

ID: 9863661
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

LVL 20

Accepted Solution

TheAvenger earned 260 total points
ID: 9865080
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

LVL 5

Author Comment

ID: 9865190
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

LVL 20

Expert Comment

ID: 9865209
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

LVL 20

Expert Comment

ID: 9865212
By the way this loop compares 10 Mb arrays for ~0.5 sec so I think it has a good performance...
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article introduced a TextBox that supports transparent background.   Introduction TextBox is the most widely used control component in GUI design. Most GUI controls do not support transparent background and more or less do not have the…
We all know that functional code is the leg that any good program stands on when it comes right down to it, however, if your program lacks a good user interface your product may not have the appeal needed to keep your customers happy. This issue can…
In this video you will find out how to export Office 365 mailboxes using the built in eDiscovery tool. Bear in mind that although this method might be useful in some cases, using PST files as Office 365 backup is troublesome in a long run (more on t…
In this video, Percona Director of Solution Engineering Jon Tobin discusses the function and features of Percona Server for MongoDB. How Percona can help Percona can help you determine if Percona Server for MongoDB is the right solution for …
###### Suggested Courses
Course of the Month8 days, 11 hours left to enroll

#### 721 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.