使用 Node.js 流读取二进制数据

lor*_*isi 6 binary encoding node.js

我正在尝试使用 fs 读取二进制文件createReadStream。假设我们知道“误解”binarylatin1作为该encoding选项的值,并且默认toString情况下在data块上使用将使用utf-8,我尝试以这种方式使用 aBuffer和缓冲区连接作为.concat函数:

var readStream = fs.createReadStream( graphPath );
                        var data;
                        readStream.on('data', (chunk) => {
                            var b = new Buffer (chunk.length);
                            if(!data) data = new Buffer (chunk.length);
                            else data = Buffer.concat([data, b]);
                        })  
                        readStream.on('end', () => {
                            console.log( "type is", typeof (data ) );
                            console.log("read graph %d",data.length);data.buffer);
                        });
Run Code Online (Sandbox Code Playgroud)

以便将新块附加到数据中。这样中的typeof对象dataobject,但它的编码似乎仍然不是二进制格式(即application/octet-stream charset=binary在内容类型方面不清楚。)

如果我只是做data+=chunk输出类型将是string.

pet*_*teb 7

如果来自文件的数据已经'binary'编码,则将编码设置readStream'binary'usingsetEncoding()并将所有块连接到单个字符串中并返回。 setEncoding()支持在 Node per Buffer 文档中为编码实现的任何编码。

const getBinary = (graphPath, asBuffer = false, cb) => {
  let readStream = fs.createReadStream(graphPath)
  let data = ''

  // set stream encoding to binary so chunks are kept in binary
  readStream.setEncoding('binary')
  readStream.once('error', err => {
    return cb(err)
  })
  readStream.on('data', chunk => (data += chunk))
  readStream.on('end', () => {
    // If you need the binary data as a Buffer
    // create one from data chunks       
    return cb(null, asBuffer ? Buffer.from(data, 'binary') : data)
  })
}
Run Code Online (Sandbox Code Playgroud)