为什么这个byte []不等于我的另一个字节[]具有相同的值?

时间:2013-04-25 20:10:21

标签: c# arrays compare bytearray

public static readonly byte[] TestArray=
    new byte[] { 0x75, 0xa5, 0x15, 0x19, 0xa0, 0x2e, 0xd9, 0x37, 0xb0, 0x4d };

public bool TestFunction() 
{
    MemoryStream s=new MemoryStream(
        new byte[] { 0x75, 0xa5, 0x15, 0x19, 0xa0, 0x2e, 0xd9, 0x37, 0xb0, 0x4d }
        );

    byte[] test=s.ToArray();
    return (test==TestArray);
}

我正在使用上面的简单代码。数组中的字节值相等。但我的TestFunction()总是返回false。到底是怎么回事?

8 个答案:

答案 0 :(得分:7)

因为数组是.Net中的引用类型,对于数组,==运算符只是检查它们是否是对内存中同一对象的引用。您需要SequenceEqual使用它来比较每个字节:

test.SequenceEqual(TestArray);

答案 1 :(得分:3)

因为您没有比较每个阵列的各个成员;您正在将引用与每个不相等的数组进行比较。

改为使用SequenceEqual

答案 2 :(得分:1)

在这种情况下,==运算符检查引用是否相等,而不是字节数组的内容是否相等。您应该迭代字节数组并检查它们是否逐字节相等,或者使用一种方法来执行该操作。

我想你是从某个地方的代码中取出来的,但是MemoryStream用法有点无意义,你可以这样做:

byte[] test = new byte[] { 0x75, 0xa5, 0x15, 0x19, 0xa0, 0x2e, 0xd9, 0x37, 0xb0, 0x4d };

答案 3 :(得分:1)

您正在将引用与对象进行比较,即==运算符 - 在字节数组的情况下 - 当且仅当两个引用指向同一对象时才返回true。但实际上你有两个不同的对象,但它们的内容相同。

您必须使用SequenceEqual方法来比较两个数组的内容

请注意,某些类可能会重载==运算符,因此它会比较对象的内容(甚至还有其他一些逻辑)。但是,对于字节数组,==不会重载,因此默认情况下只是比较引用。

答案 4 :(得分:0)

等于比较器不会执行所谓的“深度等于”检查。换句话说,equals运算符仅检查两个数组/对象是否存储在内存中的相同位置(换句话说,如果对象引用是相同的)。

要检查两个数组的值是否相等,您需要编写一个单独检查每个值的函数。

答案 5 :(得分:0)

因为byte []是一个引用类型,当你比较两个字节数组时,实际上比较它们对内存中位置的引用而不是它们的值

答案 6 :(得分:0)

在您的示例中,当您使用相等运算符(==)时,您正在比较每个人所说的数组引用,而不是它的值。

一个简单的测试:

byte[] originalArray = new byte[] { 0x75, 0xa5, 0x15, 0x19, 0xa0, 0x2e, 0xd9, 0x37, 0xb0, 0x4d };

byte[] sameReferenceArray = originalArray;
originalArray == sameReferenceArray; //true

byte[] sameContentArray = new byte[] { 0x75, 0xa5, 0x15, 0x19, 0xa0, 0x2e, 0xd9, 0x37, 0xb0, 0x4d };
originalArray == sameContentArray; //false

答案 7 :(得分:0)

MemoryStream.ToArray的代码是:

public virtual byte[] ToArray() {
    byte[] dst=new byte[this._length-this._origin];
    Buffer.InternalBlockCopy(this._buffer, this._origin, dst, 0, this._length-this._origin);
    return dst;
}

你弄错的真正原因是,你宣布了两个数组,但在另一个方面进行了比较。即使在C中,这种比较也是不正确的。