Массив байтов с заполнением нулевыми байтами в конце: как эффективно скопировать в меньший байтовый массив

Есть:

[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) и скопировать эти байты? Примечание: я не знаю, сколько будет нулевых байтов или байтов со значениями.

 Tim Cooper08 июн. 2013 г., 21:44
Какие оставшиеся байты в вашем новом массиве будут равны? Что ты'ищите делать нене имеет большого смысла.
 kdgregory08 июн. 2013 г., 21:45
Новыйbyte[] будет иметь 0 во всех элементах, поэтому вы выигралина самом деле ничего не получается, если в конце вы хотите массив из 8192 элементов.
 Pragmateek08 июн. 2013 г., 21:44
Старый добрый для цикла? Будет проще, если сможешьв части данных не должно быть нулей.

Ответы на вопрос(4)

классе, просто указать исходную позицию исходного массива, целевой массив, начальную позицию назначения и длину

        System.arraycopy(src, srcPos, dest, destPos, length);
        byte [] dest= new byte [6000];
        System.arraycopy(src, 0, dest, 0, 6000);
 Octahedron08 июн. 2013 г., 22:55
Аскер уточнил, что он не знает, сколько существует ненулевых байтов. Этот подход будет работать только если он знал заранее.

что мы можем сделать таким же образом

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

byte ar[]=new String(array).replaceAll("\0", "").getBytes();
 Aaron02 февр. 2017 г., 21:25
Мне нравится использование цепочки. Это ясно и делает это одним вкладышем!

kotlin

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

val byteArrayWithoutZeros = strWithoutZeros.toByteArray(StandardCharsets.UTF_8)
Решение Вопроса

Вот моя попытка:

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;
}
 Sagar Trehan01 янв. 2019 г., 19:57
Безопасно ли удалять все байты с конца, которые равны 0. Это выиграетТ ничего?
 Pragmateek01 янв. 2019 г., 21:21
@SagarTrehan Извините, я нене понимаю твою точку зрения.

Ваш ответ на вопрос