2016-08-02 2 views
0

Ich bin ein hohes Volumen an „Hex-Array“ Strings in der Form empfangen:Der effizienteste Weg, eine "hex Array" Zeichenfolge in einen Puffer zu kopieren?

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

Was ist der effizienteste Weg, um sie in einen bestehenden, größeren Puffer zu kopieren?

Ich vermute, die naive Art und Weise wäre:

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

Ich bin vorsichtig line[index] und dabei die einfache Bit-Verschiebung und die Summe verwenden, weil string[index] an eine andere Zeichenfolge löst nur.

+1

Vorsicht bei der Verwendung von '.replace ('', '')', das wird nur die erste Instanz von '' ''entfernen. Wahrscheinlich willst du 'str.replace (/ \ s +/g, '');' oder etwas ähnliches. Ich kann jedoch nicht mit seiner Leistung sprechen. Außerdem sollten Sie sicherstellen, dass Sie 'new Buffer (str, 'hex');' verwenden, damit der neue Puffer weiß, wie die Zeichenkette kodiert ist. – dvlsg

+0

@dvlsg danke, ich habe meine Antwort mit Ihren Vorschlägen bearbeitet . Mein JS ist rostig und ich habe den Code nicht wirklich getestet. Der Grund für den 'existierenden' Puffer ist, dass ich diese Byte-Hex-Zeilen zusammen "anhefte". – makhdumi

+0

Fair genug. Wenn Sie '.write (hexString, startPosition, 'hex')' oder 'Buffer.concat ([existingBuffer, newBuffer])' verwenden (sobald Sie den neuen Puffer aus der hexadezimalen Kette haben), dann ist es wahrscheinlich Ihre beste Wette. Ich stelle mir vor, dass die "concat" -Lösung einen völlig neuen "Buffer" macht, wenn die Speicherauslastung immer noch ein Problem ist. – dvlsg

Antwort

1

Um dies aus den Kommentaren zu bewegen,

Die Lösung, die Sie suchen sind, ist wahrscheinlich so etwas wie folgt aus:

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); 

Ich kann über 1,600,000 ops/sec durch benchmark.js mit () => write(existingBuffer, line, 0) bekommen. Ein bisschen betrügen, da ich ständig auf Position 0 schreibe, anstatt anzuhängen, aber es sollte nahe genug sein, um dir eine Idee zu geben. Der nächste, den ich mit anderen Kombinationen, die ich versuchte, kommen könnte, war ungefähr 1,200,000 ops/sec.

Auch als eine Randnotiz, würde ich stark empfehlen Buffer.alloc() wo immer Sie Ihren ursprünglichen Puffer erstellen, wenn Sie nicht sind. Sie können auch Buffer.allocUnsafe() verwenden, was zwar schneller ist, aber möglicherweise Daten ungleich Null im Puffer hinterlässt. Das kann in Ordnung sein, wenn Sie wissen, dass Sie den gesamten Puffer mit neuen Daten füllen werden, bevor Sie ihn verwenden (oder nur bekannte Slices verwenden). Mehr lesen here.

Verwandte Themen