web-dev-qa-db-ja.com

最後にnullバイトのパディングがあるバイト配列:より小さなバイト配列に効率的にコピーする方法

持ってる:

[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の配列があり、最初の配列のいくつかのインデックスから開始して、配列の最後までバイトはすべてnullバイトです。したがって、値のある6000バイトと、配列の最後に2196のnullバイトがある可能性があります。サイズ(6000)の新しい配列を効率的に作成し、それらのバイトをコピーするにはどうすればよいですか?注:nullバイト、または値を持つバイトがいくつあるかわかりません。

21
Atomix

これが私の試みです:

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

システムクラスで静的メソッド配列コピーを試してみませんか?ソース配列src開始位置、宛先配列、宛先開始位置と長さを指定するだけです

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

このようにできると思います

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

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

kotlinの場合:

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

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