diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/FileMagicNumber.java b/hutool-core/src/main/java/cn/hutool/core/io/file/FileMagicNumber.java index bbdde0d0f..8cc7f343f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/file/FileMagicNumber.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/file/FileMagicNumber.java @@ -1141,17 +1141,18 @@ public enum FileMagicNumber { @Override public boolean match(final byte[] bytes) { final byte[] byte1 = new byte[]{(byte) 0xd0, (byte) 0xcf, (byte) 0x11, (byte) 0xe0, (byte) 0xa1, (byte) 0xb1, (byte) 0x1a, (byte) 0xe1}; - final boolean flag1 = bytes.length > 515 && Arrays.equals(Arrays.copyOfRange(bytes, 0, 8), byte1); - if (flag1) { + if (bytes.length > 515 && ArrayUtil.isSubEquals(bytes, 0, byte1)) { final byte[] byte2 = new byte[]{(byte) 0xec, (byte) 0xa5, (byte) 0xc1, (byte) 0x00}; - final boolean flag2 = Arrays.equals(Arrays.copyOfRange(bytes, 512, 516), byte2); + // check 512:516 + if(ArrayUtil.isSubEquals(bytes, 512, byte2)){ + return true; + } final byte[] byte3 = new byte[]{(byte) 0x00, (byte) 0x0a, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x4d, (byte) 0x53, (byte) 0x57, (byte) 0x6f, (byte) 0x72, (byte) 0x64 , (byte) 0x44, (byte) 0x6f, (byte) 0x63, (byte) 0x00, (byte) 0x10, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x57, (byte) 0x6f, (byte) 0x72, (byte) 0x64, (byte) 0x2e, (byte) 0x44, (byte) 0x6f, (byte) 0x63, (byte) 0x75, (byte) 0x6d, (byte) 0x65, (byte) 0x6e, (byte) 0x74, (byte) 0x2e, (byte) 0x38, (byte) 0x00, (byte) 0xf4, (byte) 0x39, (byte) 0xb2, (byte) 0x71}; final byte[] range = Arrays.copyOfRange(bytes, 2075, 2142); - final boolean flag3 = bytes.length > 2142 && FileMagicNumber.indexOf(range, byte3) > 0; - return flag2 || flag3; + return bytes.length > 2142 && FileMagicNumber.indexOf(range, byte3) > 0; } return false; } diff --git a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java index 5ea16b435..3c2298207 100755 --- a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java @@ -1023,7 +1023,7 @@ public class CharSequenceUtil extends StrChecker { if (null == str || ArrayUtil.isEmpty(chars)) { return str(str); } - return filter(str, (c)-> false == ArrayUtil.contains(chars, c)); + return filter(str, (c) -> false == ArrayUtil.contains(chars, c)); } /** @@ -2052,16 +2052,16 @@ public class CharSequenceUtil extends StrChecker { * 任意一个字符串为null返回false * * @param str1 第一个字符串 - * @param start1 第一个字符串开始的位置 + * @param offset1 第一个字符串开始的位置 * @param str2 第二个字符串 * @param ignoreCase 是否忽略大小写 * @return 子串是否相同 * @see String#regionMatches(boolean, int, String, int, int) * @since 3.2.1 */ - public static boolean isSubEquals(final CharSequence str1, final int start1, + public static boolean isSubEquals(final CharSequence str1, final int offset1, final CharSequence str2, final boolean ignoreCase) { - return isSubEquals(str1, start1, str2, 0, str2.length(), ignoreCase); + return isSubEquals(str1, offset1, str2, 0, str2.length(), ignoreCase); } /** @@ -2069,23 +2069,23 @@ public class CharSequenceUtil extends StrChecker { * 任意一个字符串为null返回false * * @param str1 第一个字符串 - * @param start1 第一个字符串开始的位置 + * @param offset1 第一个字符串开始的位置 * @param str2 第二个字符串 - * @param start2 第二个字符串开始的位置 + * @param offset2 第二个字符串开始的位置 * @param length 截取长度 * @param ignoreCase 是否忽略大小写 * @return 子串是否相同 * @see String#regionMatches(boolean, int, String, int, int) * @since 3.2.1 */ - public static boolean isSubEquals(final CharSequence str1, final int start1, - final CharSequence str2, final int start2, final int length, + public static boolean isSubEquals(final CharSequence str1, final int offset1, + final CharSequence str2, final int offset2, final int length, final boolean ignoreCase) { if (null == str1 || null == str2) { return false; } - return str1.toString().regionMatches(ignoreCase, start1, str2.toString(), start2, length); + return str1.toString().regionMatches(ignoreCase, offset1, str2.toString(), offset2, length); } // endregion diff --git a/hutool-core/src/main/java/cn/hutool/core/util/PrimitiveArrayUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/PrimitiveArrayUtil.java index 13cfe610a..070ef5c8c 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/PrimitiveArrayUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/PrimitiveArrayUtil.java @@ -31,6 +31,7 @@ public class PrimitiveArrayUtil { public static final int INDEX_NOT_FOUND = -1; // region ----- isEmpty + /** * 数组是否为空 * @@ -3139,6 +3140,7 @@ public class PrimitiveArrayUtil { // endregion // region ----- startWith + /** * array数组是否以prefix开头 *
+ * byte1[offset1, byte2.length] + * || + * byte2 + *+ * + * @param bytes1 第一个数组 + * @param offset 开始位置 + * @param bytes2 第二个数组 + * @return 是否局部匹配 + */ + public static boolean isSubEquals(final byte[] bytes1, final int offset, final byte[] bytes2) { + return regionMatches(bytes1, offset, bytes2, 0, bytes2.length); + } + + /** + * 是否局部匹配,相当于对比以下子串是否相等 + *
+ * byte1[offset1, offset1 + length] + * || + * byte2[offset2, offset2 + length] + *+ * + * @param bytes1 第一个数组 + * @param offset1 第一个数组开始位置 + * @param bytes2 第二个数组 + * @param offset2 第二个数组开始位置 + * @param length 检查长度 + * @return 是否局部匹配 + */ + public static boolean regionMatches(final byte[] bytes1, final int offset1, + final byte[] bytes2, final int offset2, final int length) { + if(bytes1.length < offset1 + length){ + throw new IndexOutOfBoundsException("[byte1] length must be >= [offset1 + length]"); + } + if(bytes2.length < offset2 + length){ + throw new IndexOutOfBoundsException("[byte2] length must be >= [offset2 + length]"); + } + + for (int i = 0; i < length; i++) { + if (bytes1[i + offset1] != bytes2[i + offset2]) { + return false; + } + } + return true; } } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java index 04da83242..7426b1675 100755 --- a/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java @@ -12,6 +12,7 @@ import java.util.*; * * @author Looly */ +@SuppressWarnings("ConstantValue") public class ArrayUtilTest { @Test @@ -728,10 +729,24 @@ public class ArrayUtilTest { @Test public void copyOfRangeTest() { - String a = "aIDAT"; + final String a = "aIDAT"; final byte[] bytes1 = Arrays.copyOfRange(a.getBytes(CharsetUtil.UTF_8), 1, 1 + 4); Assert.assertEquals(new String(bytes1), new String(a.getBytes(CharsetUtil.UTF_8), 1, 4)); } + + @Test + public void regionMatchesTest() { + final byte[] a = new byte[]{1, 2, 3, 4, 5}; + final byte[] b = new byte[]{2, 3, 4}; + + Assert.assertTrue(ArrayUtil.regionMatches(a, 1, b, 0, 1)); + Assert.assertTrue(ArrayUtil.regionMatches(a, 1, b, 0, 2)); + Assert.assertTrue(ArrayUtil.regionMatches(a, 1, b, 0, 3)); + Assert.assertTrue(ArrayUtil.isSubEquals(a, 1, b)); + + Assert.assertFalse(ArrayUtil.regionMatches(a, 2, b, 0, 2)); + Assert.assertFalse(ArrayUtil.regionMatches(a, 3, b, 0, 2)); + } }