web-dev-qa-db-fra.com

Tableau d'octets avec remplissage d'octets nuls à la fin: comment copier facilement dans un tableau d'octets plus petit

Avoir:

[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]

Vouloir:

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

J'ai un tableau d'octets de taille 8192 pour commencer, et à partir d'un index dans ce premier tableau jusqu'à la fin du tableau, les octets sont tous des octets nuls. Donc, il pourrait y avoir 6000 octets avec des valeurs et 2196 octets nuls à la fin du tableau. Comment créer efficacement un nouveau tableau de taille (6000) et copier ces octets? Note: Je ne sais pas combien d’octets NULL, ou d’octets avec des valeurs, il y en aura.

18
Atomix

Voici mon essai:

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;
}
29
Pragmateek

pourquoi ne pas essayer la copie du tableau de la méthode statique dans la classe système, il suffit de donner la position de départ du tableau source, le tableau de destination, la position de départ et la longueur

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

Je pense que nous pouvons faire de cette façon aussi

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

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

Avec kotlin:

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

val byteArrayWithoutZeros = strWithoutZeros.toByteArray(StandardCharsets.UTF_8)
0
Nilesh Deokar