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。到底是怎么回事?
答案 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中,这种比较也是不正确的。