From 7483a0e0d63835e148f0db9f4a055e5bec64dea6 Mon Sep 17 00:00:00 2001 From: Philip Helger Date: Tue, 9 Jul 2024 17:18:36 +0200 Subject: [PATCH] Extended ByteArarySearcher API --- .../validator/ByteArraySearcher.java | 45 +++++++++++-------- .../validator/ByteArraySearcherTest.java | 24 ++++++++++ 2 files changed, 51 insertions(+), 18 deletions(-) create mode 100644 validator/src/test/java/org/mustangproject/validator/ByteArraySearcherTest.java diff --git a/validator/src/main/java/org/mustangproject/validator/ByteArraySearcher.java b/validator/src/main/java/org/mustangproject/validator/ByteArraySearcher.java index 169d0dd4..ac1417c3 100644 --- a/validator/src/main/java/org/mustangproject/validator/ByteArraySearcher.java +++ b/validator/src/main/java/org/mustangproject/validator/ByteArraySearcher.java @@ -5,24 +5,33 @@ public final class ByteArraySearcher { private ByteArraySearcher() { } + public static int indexOf(byte[] haystack, byte[] needle) { + if (needle.length > haystack.length) { + return -1; + } + + // Any needle to search? + if (needle.length == 0) { + return -1; + } + + for (int i = 0; i <= haystack.length - needle.length; i++) { + boolean found = true; + for (int j = 0; j < needle.length; j++) { + if (haystack[i + j] != needle[j]) { + found = false; + break; + } + } + if (found) { + return i; + } + } + + return -1; + } + public static boolean contains(byte[] haystack, byte[] needle) { - if (needle.length > haystack.length) { - return false; - } - - for (int i = 0; i <= haystack.length - needle.length; i++) { - boolean found = true; - for (int j = 0; j < needle.length; j++) { - if (haystack[i + j] != needle[j]) { - found = false; - break; - } - } - if (found) { - return true; - } - } - - return false; + return indexOf (haystack, needle) >= 0; } } diff --git a/validator/src/test/java/org/mustangproject/validator/ByteArraySearcherTest.java b/validator/src/test/java/org/mustangproject/validator/ByteArraySearcherTest.java new file mode 100644 index 00000000..fda28aaa --- /dev/null +++ b/validator/src/test/java/org/mustangproject/validator/ByteArraySearcherTest.java @@ -0,0 +1,24 @@ +package org.mustangproject.validator; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.nio.charset.StandardCharsets; + +import org.junit.Test; + +public class ByteArraySearcherTest { + @Test + public void testIndexOf () { + byte[] haystack = "Hello World".getBytes (StandardCharsets.ISO_8859_1); + assertEquals (0, ByteArraySearcher.indexOf (haystack, new byte[] {'H'})); + assertEquals (1, ByteArraySearcher.indexOf (haystack, new byte[] {'e'})); + assertEquals (0, ByteArraySearcher.indexOf (haystack, new byte[] {'H', 'e'})); + assertEquals (0, ByteArraySearcher.indexOf (haystack, new byte[] {'H', 'e'})); + assertEquals (0, ByteArraySearcher.indexOf (haystack, new byte[] {'H', 'e', 'l', 'l'})); + assertEquals (0, ByteArraySearcher.indexOf (haystack, haystack)); + assertEquals (0, ByteArraySearcher.indexOf (haystack, new byte[0])); + assertEquals (-1, ByteArraySearcher.indexOf (haystack, new byte[] {'a'})); + assertEquals (-1, ByteArraySearcher.indexOf (haystack, new byte[] {'h'})); + assertEquals (-1, ByteArraySearcher.indexOf (haystack, new byte[] {'r', 'o'})); + } +}