Java字节数组替换

Java字节数组替换,java,replace,byte,Java,Replace,Byte,如何替换字节数组的子数组 我需要类似于字符串的replace方法: “我想要比萨饼”。替换(“比萨饼”,“字节数组的替换方法”) 但是它应该适用于byte[]假设您想用另一个n字节子数组替换一个n字节子数组,您可以使用 例如: System.arraycopy(theNewBytes, startPosition, theArrayYouWantToUpdate, startPosition1, length); 如果要用不同的字节数替换n个字节,则仍需要创

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

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

“我想要比萨饼”。替换(“比萨饼”,“字节数组的替换方法”)

但是它应该适用于
byte[]

假设您想用另一个n字节子数组替换一个n字节子数组,您可以使用

例如:

System.arraycopy(theNewBytes, startPosition,
                 theArrayYouWantToUpdate, startPosition1, length);
如果要用不同的字节数替换n个字节,则仍需要创建一个新数组:

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

可以使用万能弦的力量来实现这一点:)

输出:

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

您正在处理的字节数组中有什么类型的数据?一种可能是将字节包装到输入流中,然后按照回答中的建议执行:@Renato它是来自图像文件的二进制数据。您可以尝试的一个肮脏的技巧是只需执行
新字符串(字节)
,并祈祷它能工作,然后使用字符串的
替换()
使用以相同方式构建的字符串,然后使用
str.getBytes()
返回字节。但是对于图像文件,我认为几乎任何字符串编码都会遇到非法的字节序列,因此这可能是不安全的。字节的算法与字符的算法相同,因此可以复制Java实现并将类型更改为字节:我没有替换的子数组位置(startPosition).小更正:这是arraycopy(以防初学者使用它时发现arraycopy不存在问题)。为什么在这里使用字符串?字节的转换会起作用吗?我这么做只是为了好玩,看看这是否可以实现。是的,字节数组与
数组的转换。toString()
工作得很好这是一种相当昂贵的转换方法:不仅转换为字符串(占用的内存比原始字符串多得多),它还使用regex,因为
string.replace
在引用其参数后实际上调用
replaceAll
。您可以相当容易地实现一个
indexOf
方法,该方法可以在另一个数组中查找子数组的起始位置(存在奇特的算法,但
String.indexOf
实际上是幼稚的);然后使用
System.arrayCopy
@AndyTurner我过去和现在都知道这些开销:)重点是尽可能重用现有的字符串功能。抱歉,如果没有那么好笑的话。@AlexRudenko问题的关键不一定是你需要知道它们,但是你答案的读者需要知道。
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]