将原始二进制数据写入Buffer

时间:2019-04-21 11:58:17

标签: javascript node.js buffer

我正在研究一个在PCM data上迭代的函数。我正在获取大小不一的数据块,目前正在通过缓冲区串联来处理。问题是,我很确定这种方法是性能杀手。

最简单的算法之一是对500个4800字节(=谷物)的块进行分块,并重复3次:

buf = <grain1, grain1, grain1, ..., grain500, grain500, grain500>
function(){
  // ...
  let buf = Buffer.alloc(0) // returned buffer, mutated

  // nGrains is defined somewhere else in the function
  // example: nGrains = 500
  for(let i=0;i<nGrains;i++){
    // a chunk of PCM DATA 
    // example: grain.byteLength = 4800 
    const grain = Buffer.from(this._getGrain())

    // example: nRepeats = 3
    for(let j=0;j<nRepeats;j++)
      buf = Buffer.concat([buf, grain])
  }

  return buf
}

我觉得,如果有某种方法可以将“原始数据”从给定的偏移量直接写入预先分配的缓冲区,则可以避免执行这些性能繁重的操作(1500个突变串联)。我做了以下帮助程序功能,使我的性能大大提高,但是我感觉自己做错了什么...

function writeRaw(buf, rawBytes, offset) => {
  for(i=0;i<rawBytes.byteLength;i++){
    buf.writeUInt8(rawBytes.readUInt8(i), offset + i)
  }

  return buf
}

我的功能现在看起来像这样:

function(){
  // ...
  const buf = Buffer.alloc(len) // returned buffer, immutable

  for(let i=0;i<nGrains;i++){
    const grain = Buffer.from(this._getGrain())

    for(let j=0;j<nRepeats;j++)
      writeRaw(buf, grain, (i * nRepeats + j) * grainSize)
  }

  return buf
}

我的问题是:是否有更干净的方法(或更标准的方法)来执行此操作,而不是遍历字节? Buffer.write似乎只适用于字符串,尽管这很理想……

1 个答案:

答案 0 :(得分:1)

Buffer.copy

const buf = Buffer.alloc(len);

for(let i = 0; i < nGrains; i++){
  const grain = Buffer.from(this._getGrain());

 for(let j=0;j<nRepeats;j++)
   grain.copy(/*to*/ buf, /*at*/ (i * nRepeats + j) * grainSize);
}

您也可以使用Buffer.fill

  const buf = Buffer.alloc(len);

  for(let i = 0; i < nGrains; i++) {
    const grain = Buffer.from(this._getGrain());
    buf.fill(grain, i * nRepeats * grainSize, (i + 1) * nRepeats * grainSize);
  }