查找索引另一个字节数组中的一个字节数组

2022-09-01 01:18:55

给定一个字节数组,我如何在其中找到(较小的)字节数组的位置?

这个文档看起来很有希望,使用,但如果我没记错的话,它只能让我在数组中找到要搜索的单个字节。ArrayUtils

(我看不出这有什么关系,但以防万一:有时搜索字节数组将是常规ASCII字符,其他时候它将是控制字符或扩展ASCII字符。因此,使用字符串操作并不总是合适的)

大型数组可能介于 10 到大约 10000 字节之间,较小的数组可能介于 10 左右。在某些情况下,我会有几个较小的数组,我希望在单个搜索中找到较大的数组。我有时会想要找到实例的最后一个索引,而不是第一个。


答案 1

最简单的方法是比较每个元素:

public int indexOf(byte[] outerArray, byte[] smallerArray) {
    for(int i = 0; i < outerArray.length - smallerArray.length+1; ++i) {
        boolean found = true;
        for(int j = 0; j < smallerArray.length; ++j) {
           if (outerArray[i+j] != smallerArray[j]) {
               found = false;
               break;
           }
        }
        if (found) return i;
     }
   return -1;  
}  

一些测试:

@Test
public void testIndexOf() {
  byte[] outer = {1, 2, 3, 4};
  assertEquals(0, indexOf(outer, new byte[]{1, 2}));
  assertEquals(1, indexOf(outer, new byte[]{2, 3}));
  assertEquals(2, indexOf(outer, new byte[]{3, 4}));
  assertEquals(-1, indexOf(outer, new byte[]{4, 4}));
  assertEquals(-1, indexOf(outer, new byte[]{4, 5}));
  assertEquals(-1, indexOf(outer, new byte[]{4, 5, 6, 7, 8}));
}

当您更新问题时:Java字符串是UTF-16字符串,它们不关心扩展的ASCII集,因此您可以使用string.indexOf()


答案 2

Google的Guava提供了一个Bytes.indexOf(byte[]数组,byte[]目标)。


推荐