【问题标题】:Byte array with padding of null bytes at the end: how to efficiently copy to smaller byte array最后填充空字节的字节数组:如何有效地复制到较小的字节数组
【发布时间】:2013-06-08 19:41:52
【问题描述】:

有:

[46][111][36][11][101][55][87][30][122][75][66][32][49][55][67][77][88][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0]

想要:

[46][111][36][11][101][55][87][30][122][75][66][32][49][55][67][77][88]

我有一个大小为 8192 的字节数组开始,并从第一个数组中的某个索引开始,直到数组结束,这些字节都是空字节。因此,数组末尾可能有 6000 个字节的值和 2196 个空字节。如何有效地创建一个新的大小数组(6000)并复制这些字节?注意:我不知道会有多少空字节,或者有值的字节。

【问题讨论】:

  • 新数组中剩余的字节数会相等吗?你想做的事情没有多大意义。
  • 旧的 for 循环?如果数据部分不能有零,会更简单。
  • 一个新的byte[] 将在所有元素中包含 0,因此如果你想要一个 8192 元素数组最后,你实际上不会完成任何事情。

标签: java arrays buffer


【解决方案1】:

这是我的尝试:

static byte[] trim(byte[] bytes)
{
    int i = bytes.length - 1;
    while (i >= 0 && bytes[i] == 0)
    {
        --i;
    }

    return Arrays.copyOf(bytes, i + 1);
}

public static void main(String[] args)
{
    byte[] bytes = { 0, 1, 2, 0, 3, 4, 5, 0, 6, 0, 0, 7, 8, 9, 10, 0, 0, 0, 0 };

    byte[] trimmed = trim(bytes);

    return;
}

【讨论】:

  • 从末尾删除所有为 0 的字节是否安全。这不会有什么影响?
  • @Pragmateek :我认为在某些情况下它会丢失数据,我有一个 xlsx 文件,它的最后一个十六进制八位字节为 D5000000 但是如果我将其用作仅保留 D5,文件损坏.
  • @SagarKharab 确实调整二进制文件总是需要谨慎,但这很可能是 PO 的另一个用例。 :)
【解决方案2】:

为什么不尝试系统类中的静态方法数组复制,只需给出源数组src起始位置,目标数组,目标起始位置和长度

        System.arraycopy(src, srcPos, dest, destPos, length);
        byte [] dest= new byte [6000];
        System.arraycopy(src, 0, dest, 0, 6000);

【讨论】:

  • 提问者指定他不知道有多少个非零字节。这种方法只有在他事先知道的情况下才有效。
【解决方案3】:

我认为我们也可以这样做

byte []array={0, 69, 0, 71, 0, 72};

byte ar[]=new String(array).replaceAll("\0", "").getBytes();

【讨论】:

  • 我喜欢使用链接。这很清楚,使它成为一个班轮!
【解决方案4】:

kotlin

val strWithoutZeros = String(byteArray,StandardCharsets.UTF_8).replace(0.toChar().toString(), "")

val byteArrayWithoutZeros = strWithoutZeros.toByteArray(StandardCharsets.UTF_8)

【讨论】:

    猜你喜欢
    • 2014-09-21
    • 2013-03-25
    • 1970-01-01
    • 2015-03-19
    • 2014-01-31
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 2011-02-28
    相关资源
    最近更新 更多