【问题标题】:Fast Way to compare subarray of bytes比较字节子数组的快速方法
【发布时间】:2014-07-20 09:36:24
【问题描述】:

在我目前工作的项目范围内,我使用存储在 10 字节数组中的二进制数据,并且我试图找到一种快速比较它们的方法。我最感兴趣的是 5 个最重要的字节,所以我想在字节子数组之间进行比较。 例如,我有这两个参数:

byte [] indicator = new byte[5];
byte [] current = new byte[10];

我想看看'current'的前5个字节等于'indicator'。为此,我使用了 Arrays 函数,所以我实际上是在执行以下操作:

Arrays.equals(indicator, Arrays.copyOfRange(current, 0, 5))

这当然可以,但没有要求的那么快。所以我坚信一定有更好的方法来执行这样的字节比较。也许通过使用0xFF 掩码???

有什么想法吗?

【问题讨论】:

  • 你不需要复制它。只需编写一个手动函数来迭代字节并比较它们。复制过程是什么让你慢下来。 private static compareFirstNBytes(byte[] a, byte[] b, int n) {//}
  • 我很好奇 - 您的尝试速度有多快,需要多快?因为我猜你的尝试已经相当快了(虽然一个简单的循环会更快)
  • 这不会有太大的不同...

标签: java arrays compare byte mask


【解决方案1】:

只进行迭代会更快,因为copyOfRange 会重新分配内存并创建一个新数组。

public boolean isEqual(byte[] a1, byte[] a2, int size) {
    for(int i=0;i<size;i++)
        if (a1[i] != a2[i])
            return false;
    return true;
}

【讨论】:

    【解决方案2】:

    你可以编写你的辅助方法,它会比分配一个新副本更快:

    public boolean equalsInRange (byte[] arr1, int from1, int to1, byte[] arr2, int from2, int to2) {
        if (to1 - from1 < 0 || to1 - from1 != to2 - from2)
            return false;
        int i1 = from1, i2 = from2;
        while (i1 <= to1) {
            if (arr1[i1] != arr2[i2])
                return false;
            ++i1;
            ++i2;
        }
        return true;
    }
    

    【讨论】:

      【解决方案3】:

      Java 9+ 的解决方案:

      Arrays.equals(indicator, 0, 5, current, 0, 5);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多