JAVA-如何使用正则表达式模式替换二进制文件(.exe)中的字符串

JAVA-如何使用正则表达式模式替换二进制文件(.exe)中的字符串,java,python,io,webdriver,selenium-chromedriver,Java,Python,Io,Webdriver,Selenium Chromedriver,我需要读取一个名为“chromedriver.exe”的文件,并替换所有出现的以“cdc_”开头、长度为26个字符的字符串。所以,我的正则表达式是“cdc{22}”。它匹配以“cdc_”开头的字符串,其后有22个字符。(字符串->cdc_kwjeorialeksjeiwRTkwjr的示例) 我的替代品将是这个26个字符的字符串“plp_roepstdlwoeproslPOweos” 我用python(不是我的)编写了这段代码,它实现了我上面描述的功能,但我需要用Java转换它。 所以问题是:如何

我需要读取一个名为“chromedriver.exe”的文件,并替换所有出现的以“cdc_”开头、长度为26个字符的字符串。所以,我的正则表达式是“cdc{22}”。它匹配以“cdc_”开头的字符串,其后有22个字符。(字符串->cdc_kwjeorialeksjeiwRTkwjr的示例)

我的替代品将是这个26个字符的字符串“plp_roepstdlwoeproslPOweos”

我用python(不是我的)编写了这段代码,它实现了我上面描述的功能,但我需要用Java转换它。 所以问题是:如何在Java中做到这一点?请帮助

import io
import re
import string

replacement = "plp_roepstdlwoeproslPOweos".encode()

with io.open("chromedriver.exe", "r+b") as fh:
    for line in iter(lambda: fh.readline(), b""):
        if b"cdc_" in line:
            fh.seek(-len(line), 1)
            newline = re.sub(b"cdc_.{22}", replacement, line)
            fh.write(newline)

这是一种快速而肮脏的方法。将文件读入字节数组,搜索文本,如果找到则替换,然后写回文件

private void replace(String filename) throws Exception
{
    File file=new File(filename);
    int length=(int)file.length();
    byte[] data;
    try(FileInputStream in = new FileInputStream(file); 
        ByteArrayOutputStream bs=new ByteArrayOutputStream(length))
    {
        byte[] buffer=new byte[128_000];
        int len=0;
        while((len=in.read(buffer))>0)
            bs.write(buffer,0,len);
        in.close();
        bs.close();
        data=bs.toByteArray();
    }
    searchAndReplace(data);
    
    try(FileOutputStream out=new FileOutputStream(file);
        ByteArrayInputStream bs=new ByteArrayInputStream(data))
    {
        byte[] buffer=new byte[128_000];
        int len=0;
        while((len=bs.read(buffer))>0)
            out.write(buffer,0,len);
        bs.close();
        out.flush();
        out.close();
    }
}

private void searchAndReplace(byte[] data)
{
    byte[] replacements="plp_roepstdlwoeproslPOweos".getBytes(StandardCharsets.US_ASCII);
    byte[] first="cdc_".getBytes(StandardCharsets.US_ASCII);
    Pattern test=Pattern.compile("cdc_.{22}");
    
    for(int i=0;i<data.length-replacements.length;i++)
    {
        if(data[i]==first[0] && data[i+1]==first[1] && data[i+2]==first[2] && data[i+3]==first[3]) // check for consecutive bytes 
        {
            String text=new String(data, i, replacements.length, StandardCharsets.US_ASCII);
            if(test.matcher(text).matches()) // found it
            {
                System.arraycopy(replacements, 0, data, i, replacements.length);
                i+=replacements.length;
            }
        }
    }
}
private void replace(字符串文件名)引发异常
{
文件=新文件(文件名);
int length=(int)file.length();
字节[]数据;
try(FileInputStream in=newfileinputstream(file);
ByteArrayOutputStream bs=新ByteArrayOutputStream(长度))
{
字节[]缓冲区=新字节[128_000];
int len=0;
而((len=in.read(buffer))>0)
写入(缓冲区,0,len);
in.close();
bs.close();
data=bs.toByteArray();
}
搜索和替换(数据);
try(FileOutputStream out=新的FileOutputStream(文件);
ByteArrayInputStream bs=新的ByteArrayInputStream(数据))
{
字节[]缓冲区=新字节[128_000];
int len=0;
而((len=bs.read(buffer))>0)
out.write(缓冲区,0,len);
bs.close();
out.flush();
out.close();
}
}
专用无效搜索和替换(字节[]数据)
{
byte[]replacements=“plp_roepstdlwoeproslPOweos”.getBytes(StandardCharsets.US_ASCII);
byte[]first=“cdc”.getBytes(StandardCharsets.US\u ASCII);
模式测试=Pattern.compile(“cdc{22}”);

对于(int i=0;i请显示Java代码并详细解释错误。“尝试了一些解决方案,但它们不起作用”是不够的信息。在没有任何信息的情况下,我们应该如何查找错误?因为您有一个用Python编写的工作解决方案,您可以轻松地将结果文件与预期文件(作为Python脚本的输出)进行比较。首先,你应该发布你的Java代码,这样我们可以帮助你改进它。但一般来说,你不会以文本的形式读取二进制文件,也不会用Java进行字符串替换。因为Java会将这些
字节
s转换为
字符
s,并以相反的方式写入。这对二进制文件来说是致命的。请将文件读入
字节[]
,然后在那里进行查找和替换,然后将字节数组写回文件。@vanje没有错误。我实际上是在问如何在Java中进行查找。@Sascha我不会发布我的Java代码,因为方法完全错误,我将二进制文件作为文本文件打开