Java字节数组替换



如何替换字节数组的子数组?

我需要类似于字符串的replace方法:

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

但它应该适用于CCD_ 2。

假设要用另一个n字节子数组替换n字节子阵列,则可以使用System.arraycopy

例如:

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

如果你想用不同数量的字节替换n个字节,你无论如何都需要创建一个新的数组:

  • 创建具有所需长度的新数组(前缀长度+新部分长度+后缀长度(
  • 使用arrayCopy从现有数组中复制前缀
  • 复制新部分
  • 从现有数组中复制后缀

可以使用万能字符串的力量来做到这一点:(

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);
}

使用自定义收集器从这个答案到ByteArray

测试结果:

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]

最新更新