如何在文件中找到一系列字节并将其替换为另一个缓冲区?

时间:2019-02-03 13:50:23

标签: javascript node.js buffer

基本上,我正在使用fs.readFile在NodeJS中读取文件,这将返回文件的缓冲区。

然后我想在此缓冲区内找到某种字节模式,并用相同大小的新缓冲区替换它们(或将其余缓冲区填充到00(如果较小的话)。)

我尝试将缓冲区设置为字符串并使用.replace,但这会使文件大小加倍,更不用说这实际上并不实用。

let data = await readFile('mytest.exe');

var pattern = new Buffer.from([
  0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90
])

使用文件字节交叉引用模式并找到它,将32字节的字符串转换为缓冲区,并使用字符串的32字节覆盖缓冲区,然后将其保存在文件中。

1 个答案:

答案 0 :(得分:1)

Buffer.indexOf是查找职位所需要的,然后使用Buffer.copy覆盖它。

/* Replaces all occurences of "pattern" in the "data" with "replace",
   if "replace" is shorter than "pattern" the rest will be filled with 0s, a longer "replace" will get trimmed of */
function replace(/*Buffer*/ data, /*Buffer*/ pattern, /*Buffer*/ replace) {
 let position = data.indexOf(pattern);

 while (position !== -1) {
   data.fill(0, /*from*/ position, /*to*/ position + pattern.length);

   replace.copy(
     /*to*/ data,
     /*at*/ position, 
     /*from*/ 0, 
     /*to*/ pattern.length
   );      
   // continue search:
   position = data.indexOf(pattern, /*starting at*/ position + pattern.length + 1);
 }
}