在Node.js中读取部分二进制文件的最佳方法是什么?
我希望访问“header”中的特定字节(少于前100个字节)或逐字节读取文件。
答案 0 :(得分:53)
以下是fs.read()
中fs.open()
返回的文件描述符中前100个字节的示例:
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));
});
});
答案 1 :(得分:0)
这是另一个选择
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))
});