How to read binary files byte by byte in Node.js
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 the file byte by byte.
Here is an example of fs.read()
-ing the first 100 bytes from a file descriptor returned by fs.open()
:
var fs = require('fs');
fs.open('file.txt', 'r', function(status, fd) {
if (status) {
console.log(status.message);
return;
}
var buffer = Buffer.alloc(100);
fs.read(fd, buffer, 0, 100, 0, function(err, num) {
console.log(buffer.toString('utf8', 0, num));
});
});
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 <integer> Where the new Buffer will start. Default: 0.
end <integer> Where the new Buffer will end (not inclusive). Default: buf.length.
Returns: <Buffer>
*/
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))
});