Java замена байтового массива - PullRequest
2 голосов
/ 21 апреля 2020

Как заменить подмассив байтового массива?

Мне нужно что-то похожее с методом replace для строк:

"I want pizza".replace("pizza", "replace method for byte arrays")

, но оно должно работать для byte[].

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Предполагая, что вы хотите заменить n-байтовый вложенный массив другим n-байтовым вложенным массивом, вы можете использовать System.arrayCopy.

Например:

System.arrayCopy(theNewBytes, startPosition,
                 theArrayYouWantToUpdate, startPosition1, length);

Если вы хотите заменить n байтов некоторым другим количеством байтов, вам все равно нужно создать новый массив:

  • Создать новый массив с желаемой длиной (длина префикса + длина новой части + длина суффикса)
  • Скопируйте префикс из существующего массива, используя arrayCopy
  • Скопируйте новую часть
  • Скопируйте суффикс из существующего массива.
0 голосов
/ 21 апреля 2020

Для этого можно использовать силу всемогущей строки :)

static byte[] replace(byte[] src, byte[] find, byte[] replace) {
    String replaced = cutBrackets(Arrays.toString(src))
            .replace(cutBrackets(Arrays.toString(find)), cutBrackets(Arrays.toString(replace)));

    return Arrays.stream(replaced.split(", "))
            .map(Byte::valueOf)
            .collect(toByteArray());
}

private static String cutBrackets(String s) {
    return s.substring(1, s.length() - 1);
}

private static Collector<Byte, ?, byte[]> toByteArray() {
    return Collector.of(ByteArrayOutputStream::new, ByteArrayOutputStream::write, (baos1, baos2) -> {
        try {
            baos2.writeTo(baos1);
            return baos1;
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }, ByteArrayOutputStream::toByteArray);
}

Используя собственный Collector.toByteArray из этот ответ

Результаты теста :

byte[] arr = {10, 20, 30, 40, 50, 51, 52, 53, 54, 62, 63};
byte[] find = {10, 20, 30};
byte[] replace = {21, 22, 23, 31, 32, 33};

System.out.println(Arrays.toString(replace(arr, find, replace)));

Вывод:

[21, 22, 23, 31, 32, 33, 40, 50, 51, 52, 53, 54, 62, 63]
...