0

我有一个数组,它是我读入的文件的字节 []。我需要检查文件的前 5 个字节。首先,我这样做了:

if (ips_bytes[0] != ips_ident[0] && ips_bytes[1] != ips_ident[1] && ips_bytes[2] != ips_ident[2]
            && ips_bytes[3] != ips_ident[3] && ips_bytes[4] != ips_ident[4]) {
        return "Nope!";
    }

这行得通,但它看起来不是很好,我想它不是很有效。所以我研究了其他方法并找到了 Arrays.equals()。我更改了代码以反映这一点:

if (!Arrays.equals(ips_ident, Arrays.copyOfRange(ips_bytes, 0, 4))) {
        return "Baka";
    }

这不起作用,我尝试了 0, 4 和 1, 5 来查看范围是否不同。我是否因为这看起来正确而遗漏了什么?数组值绝对正确。

4

3 回答 3

6

你的条件不等价。

如果所有对应元素对不相等,则第一个为真

如果存在至少一对不相等的元素,则第二个为真

我相信您需要第二个代码,但您需要对其进行一些修复。 Arrays.copyOfRange的第三个参数索引被排除在外。所以你需要

Arrays.copyOfRange(ips_bytes, 0, 5))

或更好

Arrays.copyOfRange(ips_bytes, 0, ips_ident.length))
于 2013-08-01T01:00:30.187 回答
1

Here's an approach that doesn't use unnecessary memory and is re-usable.

Just use a for loop:

public boolean compareFirstBytes(byte[] arrayOne, byte[] arrayTwo, int range) {
    for (int i = 0; i < range; i++) {
        if (arrayOne[i] != arrayTwo[i]) {
            return false;
        }
    }
    return true;
}
于 2013-08-01T01:14:51.273 回答
1

我想它应该是相同的字节范围:

if (!Arrays.equals(Arrays.copyOfRange(ips_ident, 0, 5), Arrays.copyOfRange(ips_bytes, 0, 5)))

例子

char[] arr1 = new char[] { 'a', 'b', 'c', 'd', 'e' };
char[] arr2 = new char[] { 'a', 'b', 'c', 'k', 'm' };
System.out.println(Arrays.equals(Arrays.copyOfRange(arr1, 0, 3), Arrays.copyOfRange(arr2, 0, 3)));
于 2013-08-01T01:00:46.570 回答