nodejs 如何对 16进制进行删改字节?

image.png
例如上图的 47 位置,我需要删掉 这个 47 之前这部分 然后保存。
在nodejs 通过

 fs.readFile(list[i], (err,data)=>{ 
    console.log(data)
 }}

Buffer 打印结果如下
image.png

有没有动nodejs 的大佬指点一下怎么 删掉这段

阅读 2k
1 个回答

没有你想的那么复杂:

  1. 其实你这个是从一个二进制文件读取部分,然后转存到另外的过程。
  2. 为了实现原文件某些部分不被转存(相当于删除掉),你需要知道需要转存的起点。
  3. 对于这个起点,一、如果数据结构是固定的,则相当于跳过直接跳过某些字节,既直接设定一个偏移量即可;二、如果数据结构不固定,但有一个规范的结尾标记,可以从头开始查找这个标记来获取需要偏移的字节量。
  4. 之后就是从需要删除的部分之后读取数据转存到新文件即可,完全是二进制文件读写操作啦。

从上可见,这里关键的地方其实就是找到那个偏移地址而已,其它的都是标准的二进制文件读写操作。

fs.readFile(list[i], (err,data)=>{ 
   if(err){
      return;
   }
   var key = 0;

   for(let a = 0; a < data.length; a++ ){
      if(data[a] == 71) {
         key = a
         break
      }
   }
   var buf = Buffer.from(data.slice(key,data.length))
   fs.writeFile(list[i],buf,function(err) {
      if (err) {
         throw err;
      }
   });
})

上述是题主提供的解决方案。

fs.openSync,fs.readSync,fs.writeSync等来处理的基础伪代码可以为

let rFD = fs.openSync(list[i], 'r' );  // 读取用的文件句柄
let wFD = fs.openSync( list[i]+'_T', 'w'); //写入用的文件句柄

const  buffSize = 10000;             // 定义缓冲区大小,这里定义为10k
let buff = new Uint8Array( buffSize ); // 申请了具体的缓冲空间,最好这部分空间能覆盖到需要删除的部分,
                                     // 现在假定覆盖到,既缓冲区肯定一开始就可以定位需要删除的部分

let rCount = 0; // 每次计数读取到的数据量
let wCount = 0; // 每次计数需要写入的数据量
let twCount = 0; // 记录每次实际写入的数据量

let rPosition = 0;  // 文件读写指针偏移量
let wPosition = 0;  // 文件写入指针偏移量


// 处理前面删除前面不要的部分
rCount = fs.readSync( rFD , buff , 0 , buffSize , rPosition );
rPosition = rPosition + rCount; // 更新下次读取的偏移位置
let delEnd = 0;

// 具体处理需要删除的部分定位,需要根据情况调整
for( let i=0; i<rCount; i++){
    if ( buff[i] == 71){
        delEnd = i;
        break;
    }
}

wCount = rCount - (delEnd -1);

// 具体处理需要删除的部分定位,需要根据情况调整(结束)

twCount = fs.writeSync( wFD, buff, (delEnd -1) , wCount, wPosition );

if( twCount != wCount ){
   // 写入不成功的错误处理
   console.log("Err!文件写入出错!");
   fs.closeSync(rFD);
   fs.closeSync(wFD);
   return -1;
}

wPosition = wPosition + twCount; // 更新下次写入的偏移位置

// 后面就是直接读取来写入了:
while(1){
    rCount = fs.readSync( rFD , buff , 0 , buffSize , rPosition );
    rPosition = rPosition + rCount; // 更新下次读取的偏移位置
    wCount = rCount;
    twCount = fs.writeSync( wFD, buff, 0, wCount, wPosition );

    if( twCount != wCount ){
           // 写入不成功的错误处理
           console.log("Err!文件写入出错!");
           fs.closeSync(rFD);
           fs.closeSync(wFD);
           return -1;
    }

    wPosition = wPosition + twCount; // 更新下次写入的偏移位置
    if( twCount < buffSize) break; // 因为读取的数已经不足以填满缓冲区了,表示文件已经读完了。
}
fs.closeSync(rFD);
fs.closeSync(wFD);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进