比较两个字节数组? (Java)

问题描述:

我有一个字节数组,里面有一个〜已知的二进制序列。我需要确认二进制序列是它应该是什么。除了==之外,我已尝试.equals,但都没有工作。比较两个字节数组? (Java)

byte[] array = new BigInteger("1111000011110001", 2).toByteArray(); 
if (new BigInteger("1111000011110001", 2).toByteArray() == array){ 
    System.out.println("the same"); 
} else { 
    System.out.println("different'"); 
} 
+0

读取可你只是直接比较字符串? – objects 2011-03-26 02:51:52

+1

@objects - 前导零。此外,字符串/ BigInteger的东西可能只是一种说明字节数组比较问题的方式。 – 2011-03-26 03:13:27

+0

您是否尝试过使用compareTo方法?顺便说一句''==原始值进行比较仅供参考 – ChriskOlson 2014-02-13 00:48:21

在你的榜样,您有:

if (new BigInteger("1111000011110001", 2).toByteArray() == array) 

当对象打交道,==在java中比较参考值。您正在检查toByteArray()返回的数组的引用是否与array中的引用相同,这当然不会成立。此外,数组类不会覆盖.equals(),因此行为是Object.equals(),它也只是比较参考值。

为了比较内容两者的阵列,由Arrays class

byte[] array = new BigInteger("1111000011110001", 2).toByteArray(); 
byte[] secondArray = new BigInteger("1111000011110001", 2).toByteArray(); 
if (Arrays.equals(array, secondArray)) 
{ 
    System.out.println("Yup, they're the same!"); 
} 

查看静态java.util.Arrays.equals()方法家族。有一个完全符合你想要的。

Java不超载运营商,所以通常需要对非基本类型的方法。尝试Arrays.equals()方法。

当然,Arrays.equal的接受的答案(字节[]第一,字节[]第二提供的静态阵列的比较方法) 是正确的。 我喜欢在较低级别工作,但我无法找到一个低级别的高效函数来执行相等测试范围。我不得不掀起了我自己,如果有人需要它:

public static boolean ArraysAreEquals(
byte[] first, 
int firstOffset, 
int firstLength, 
byte[] second, 
int secondOffset, 
int secondLength 
) { 
    if(firstLength != secondLength) { 
     return false; 
    } 

    for(int index = 0; index < firstLength; ++index) { 
     if(first[firstOffset+index] != second[secondOffset+index]) { 
      return false; 
     } 
    } 

    return true; 
} 
+0

这是一个很好的解决方案来测试数组的一个子集而不是整个事情。但是请注意,Arrays.equals(byte [],byte [])几乎完成了您在此处所做的所有操作(除了更有效地处理这两个值是相同的对象,并处理空数组传递的优雅)。当选择使用标准库实现时,社区将支持该标准库,或者编写一个需要永久支持的自定义实现,每次我都会选择前者。 – 2015-08-27 21:03:19

+0

Tom Dibble说的是什么。请以某种方式备份您的答案或将其删除...... – 2015-10-28 08:55:02

+4

答案对于有两个数组且需要比较其中的字节范围而不首先制作数组副本的用例很有用。数组副本会增加开销,增加垃圾并且不需要。我需要的是低级c风格memcmp(),这符合需要。当然,memcmp()只需要1个长度参数。这个功能足够接近。 – Bamaco 2015-10-29 14:30:35

您可以同时使用Arrays.equals()MessageDigest.isEqual()。这两种方法虽然有一些差异。

MessageDigest.isEqual()是一个时间常数比较方法,Arrays.equals()是非时间常数,如果您在安全应用程序中使用它,可能会带来一些安全问题。

这种差异的细节可以在Arrays.equals() vs MessageDigest.isEqual()