最有效的复制"十六进制数组的方法"字符串到缓冲区?

时间:2016-08-02 21:11:40

标签: node.js

我收到了大量的"十六进制数组"表格中的字符串:

'16 03 03 00 50 40 f2 12 71 0b c0 4f 99 dc 87 6f'

将它们复制到现有的更大缓冲区的最有效方法是什么?

我猜测天真的方式是:

var lineBuffer = new Buffer(line.replace(/\s+/g, ''), 'hex');
lineBuffer.copyTo(mainBuffer, offset);
offset += 16;

我担心使用line[index]并执行简单的位移和求和,因为string[index]只是解析为另一个字符串。

1 个答案:

答案 0 :(得分:1)

要将其移出评论,

您正在寻找的解决方案可能是这样的:

const line = '16 03 03 00 50 40 f2 12 71 0b c0 4f 99 dc 87 6f';
const regex = / /g;
const encoding = 'hex';
const replacement = '';
function getHexString(input) {
  return input.replace(regex, replacement);
}
const existingBuffer = Buffer.alloc(1024); // just as an example
const offset = existingBuffer.length; // or wherever you need them to go.
function write(buffer, str, pos) {
  const hexString = getHexString(str);
  buffer.write(hexString, pos, encoding);
}
write(existingBuffer, line, 0);

我可以通过带有1,600,000 ops/sec的benchmark.js获得() => write(existingBuffer, line, 0)。作弊,因为我经常写0而不是追加,但它应该足够接近你的想法。我可以与我尝试的其他组合最接近的是1,200,000 ops/sec

另外作为附注,我强烈建议您在创建原始缓冲区的任何地方使用Buffer.alloc(),如果不是的话。您也可以使用更快的Buffer.allocUnsafe(),但这可能会在缓冲区中留下非零数据。如果你知道在使用它之前要用新数据填充整个缓冲区(或者只使用已知填充的切片),这可能没问题。更多阅读here