From 70503136f18749edc9a3345b69c75800fc6e83a6 Mon Sep 17 00:00:00 2001 From: FULaBUla <46469068+FULaBUla@users.noreply.github.com> Date: Tue, 30 Mar 2021 19:43:15 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20(hutool-core):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=8B=86=E5=88=86byte=E6=95=B0=E7=BB=84=E4=B8=BA=E5=87=A0?= =?UTF-8?q?=E4=B8=AA=E7=AD=89=E4=BB=BD=E6=97=B6=E6=9C=80=E5=90=8E=E4=B8=80?= =?UTF-8?q?=E7=BB=84=E9=95=BF=E5=BA=A6=E4=B8=8D=E8=B6=B3=20len=20=E6=97=B6?= =?UTF-8?q?=E4=BE=9D=E6=97=A7=E6=8C=89=E7=85=A7=20len=20=E5=88=86=E9=85=8D?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E8=AF=BB=E5=8F=96=E8=BF=87=E5=A4=9A=E9=A2=9D?= =?UTF-8?q?=E5=A4=96=E6=95=B0=E6=8D=AE=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 修改 1. 在原有实现中,不论最后一组数据有多少都会按照 len 来分配空间,如果最后一组数据长度小于 len 但是又按照 len 的长度分配空间的话就会出现很多无意义的数据,为了保持数据的干净,改为在最后一组时按照剩余数据长度分配空间,确保不会填充无意义的数据。 2. 修改了变量的名称,使得更容易理解变量的意义。 3. 修改了计算等份数量的实现,因为余数必然比 len 小,所以如果出现余数必然是只加 1 的,因此去除原有的专门记录额外长度的 z 变量,当有余数的时候直接在等份数量上加 1 即可。 4. 增加了测试方法用于验证修改是否正确 --- .../hutool/core/util/PrimitiveArrayUtil.java | 22 +++++++++---------- .../cn/hutool/core/util/ArrayUtilTest.java | 8 +++++++ 2 files changed, 19 insertions(+), 11 deletions(-) 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 f0e1a2ee9..c7ac79523 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 @@ -520,26 +520,26 @@ public class PrimitiveArrayUtil { // ---------------------------------------------------------------------- split /** - * 拆分byte数组为几个等份(最后一份可能小于len) + * 拆分byte数组为几个等份(最后一份按照剩余长度分配空间) * * @param array 数组 * @param len 每个小节的长度 * @return 拆分后的数组 */ public static byte[][] split(byte[] array, int len) { - int x = array.length / len; - int y = array.length % len; - int z = 0; - if (y != 0) { - z = 1; + int amount = array.length / len; + int remainder = array.length % len; + if (remainder != 0) { + ++amount; } - byte[][] arrays = new byte[x + z][]; + byte[][] arrays = new byte[amount][]; byte[] arr; - for (int i = 0; i < x + z; i++) { - arr = new byte[len]; - if (i == x + z - 1 && y != 0) { - System.arraycopy(array, i * len, arr, 0, y); + for (int i = 0; i < amount; i++) { + if (i == amount - 1 && remainder != 0) { + arr = new byte[remainder]; + System.arraycopy(array, i * len, arr, 0, remainder); } else { + arr = new byte[len]; System.arraycopy(array, i * len, arr, 0, len); } arrays[i] = arr; 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 ac3f6c719..5df5ad6c6 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java @@ -424,4 +424,12 @@ public class ArrayUtilTest { Assert.assertTrue(o instanceof Integer); } } + + @Test + public void splitTest() { + byte[] array = new byte[1024]; + byte[][] arrayAfterSplit = ArrayUtil.split(array, 500); + Assert.assertEquals(3, arrayAfterSplit.length); + Assert.assertEquals(24, arrayAfterSplit[2].length); + } }