我收到了大量的"十六进制数组"表格中的字符串:
'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]
只是解析为另一个字符串。
答案 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。