How to read binary files byte by byte in Node.js

前端 未结 2 1104
离开以前
离开以前 2020-12-13 06:01

What is the best way to read part of a binary file in Node.js?

I am looking to either access specific bytes in the \"header\" (less than the first 100 bytes) or read

2条回答
  •  抹茶落季
    2020-12-13 06:49

    This is another option

    const fs = require('fs');
    
    const fileName = 'something.bin'
    
    /*
    Requirements ex:
    Content in 512 bytes chunks. 
    Send the 512 bytes packet as a 1024 char string, where each byte is sent as a 
    2 hex digits. 
    An "addr" field starts from 0 and tracks the offset of the first byte of the 
    packet. 
    */
    function chunk(s, maxBytes) {
      //! https://nodejs.org/api/buffer.html#buffer_buf_slice_start_end
      /*
        buf.slice([start[, end]])
        start  Where the new Buffer will start. Default: 0.
        end  Where the new Buffer will end (not inclusive). Default: buf.length.
        Returns: 
      */
    
      let buf = Buffer.from(s);  
      const result = [];
      let readBuffer = true
      let startChunkByte = 0
      let endChunkByte = maxBytes
      while(readBuffer) {
        // First round
        startChunkByte === 0 ? endChunkByte = startChunkByte + maxBytes : ""
    
        //Handle last chunk
        endChunkByte >= buf.length ? readBuffer = false : ""
    
        // addr: the position of the first bytes.  raw: the chunk of x bytes
        result.push({"addr":startChunkByte,"raw":buf.slice(startChunkByte, endChunkByte).toString('hex')});
    
        startChunkByte = endChunkByte
        endChunkByte = startChunkByte + maxBytes
      }
      return result;
    }
    
    fs.readFile(fileName, (err, data) => {
      if (err) throw err;
      // Let's choose 512 bytes chunks
      const arrBinChunk =  chunk(data, 512)
      arrBinChunk.forEach(element => console.log(element))
    
      //Tests - should be able to see 1024, 1024, as per riquerements
      arrBinChunk.forEach(element => console.log(element.raw.length))
    });
    

提交回复
热议问题