nodejs 读取并处理二进制文件

项目中因板子存储能力有限,直接将曲线的点存储为二进制文件,nodejs直接读取二进制文件,读取完将文件删除

解释:

module.exports = function(sender){
var fs= require('fs');   //使用nodejs的FS文件模块

//先判断底层系统是否生成新的文件,如果不存在返回给  页面一个wait,则页面上不做操作
fs.open("CurveData0.cdb",'r',function(err,result){
  if(err){
    if(err.code == "ENOENT"){
    console.log("文件和目录不存在")
    sender.success('wait')
  }else{
    console.log("打开文件失败")
    sender.error(err)
  }

}else{

//若文件存在,则读取文件
  fs.readFile(result,function(err, bytes){
    if(err){
      console.log("读取文件失败")
      sender.error(err)
    }else{
      var buf=new Buffer(bytes); //将文件中读取的二进制数据,存入一个buffer对象
      var offset=0;
      var list = [];
      var line1=[];

                    //遍历buffer中的每一个二进制

                    //二进制文件如下

                   0000 2d00 0000 0000 0000 0000 0000 
                   0100 3100 0000 0000 0000 0000 0000 
                   0200 3600 0000 0000 0000 0000 0000 
         0300 3a00 0000 0000 0000 0000 0000 
      0400 3e00 0000 0000 0000 0000 0000 
      0500 4300 0000 0000 0000 0000 0000 
      0600 4700 0000 0000 0000 0000 0000 
      0700 4b00 0000 0000 0000 0000 0000

      while(offset<buf.length){
        list.push(readRecord(buf,offset))  //前两个byte为时间   后面12个  每两个byte 为一个数据点
        offset+=14
      }
      var charttime=new Date().getTime()+28800000-3000
      for(var i=0;i<list.length;i++){
        line1.push([charttime+i,list[i].value1])
      }

                    //读取完毕后,删除文件
       fs.unlink("CurveData0.cdb",function(err,result){
       if(err){
         console.log("删除失败")
       }
     })
    sender.success(line1)
 }
})
}
})

readIntLE:小端对齐转换二进制为十进制
function readRecord(buf,offset){
return{
time:buf.readIntLE(offset,2),
value1:buf.readIntLE(offset+2,2),
value2:buf.readIntLE(offset+4,2),
value3:buf.readIntLE(offset+6,2),
value4:buf.readIntLE(offset+8,2),
value5:buf.readIntLE(offset+10,2),
value6:buf.readIntLE(offset+12,2),
}
}

}

原文地址:https://www.cnblogs.com/nazi549038167/p/8865510.html