如何比较两个字节数组

25

我有两个完全相同的字节数组。我尝试过:

if (bytearray1 == bytearray2) {...} else {...}

if (Array.Equals(bytearray1, bytearray2)) {....} else {...}

始终都走到else语句!我不知道为什么!我手动多次检查了这两个数组!!!


1
请参考相关链接:https://dev59.com/c3VD5IYBdhLWcg3wO5ED - Anthony
4个回答

74

尝试使用SequenceEqual扩展方法。例如:

byte[] a1 = new byte[] { 1, 2, 3 };
byte[] a2 = new byte[] { 1, 2, 3 };
bool areEqual = a1.SequenceEqual(a2); // true

12

== 运算符通过引用比较; 它们是两个不同的实例。

Array.Equals 实际上是 Object.Equals,它调用实例的 Equals 方法。
由于数组没有重写 Equals(),因此这也会通过引用进行比较。

相反,您应该调用 LINQ 的 SequenceEqual() 方法。


8

== 运算符和 Equals 方法都会测试引用相等性。因为你有两个独立的数组,它们永远不会相等。

如果你想测试两个数组是否具有相同的内容和顺序,请尝试使用 SequenceEqual 方法。


-5

作为替代方案,如果您不熟悉使用LINQ,您可以使用System.Convert类...

byte[] a1;
byte[] a2;

if (System.Convert.ToBase64String(a1) == System.Convert.ToBase64String(a2)) {
    doSomething();
}
else {
    doSomethingElse();
}

6
我不太愿意将两个数组转换为字符串,再对字符串进行迭代以进行比较。我更喜欢只使用LINQ方法或编写自己的方法来一次性迭代。 - Davi Fiamenghi
1
非常低效且毫无必要。就像Davi Fiamenghi所说的那样,要么使用SequenceEqual,要么只需进行简单的循环比较。 - chris
这将取决于比较的一侧是否已经在base64中,如果是这样,您可以将另一侧也转换为base64。当您想要呈现可读的byte[]数组时,这种情况相当普遍,例如,在使用哈希进行文档验证时。 - Sam Shiles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接