2017-03-15 3 views
0

Ich versuche, synchron in Knotenparameter von der Konsole zu lesen, konnte ich folgendes tun:Puffer gefüllt mit Unicode Nullen

var load = function() { 
    const BUFFER_LENGTH = 1024; 
    const stdin = fs.openSync('/dev/stdin', 'rs'); 
    const buffer = Buffer.alloc(BUFFER_LENGTH); 
    console.log('Provide parameter: '); 
    fs.readSync(stdin, buffer, 0, BUFFER_LENGTH); 
    fs.closeSync(stdin); 
    return buffer.toString().replace(/\n*/, ''); 
} 

Es funktioniert, aber hier ist eine seltsame Sache:

var loadedValue = load(); 
console.log(loadedValue); // displays "a", if I typed "a", so the result is correct 
console.log({loadedValue}); // displays {a: 'a\n\u0000\u0000....'} 

Wenn ich den Wert in ein Objekt hole, werden die verbleibenden BUFFER-Bits in einer Zeichenfolge angezeigt. Warum das? Wie kann ich sie loswerden? Regexp auf eine Zeichenfolge vor dem Erstellen eines Objekts funktioniert nicht.

Antwort

1

Buffer.alloc(BUFFER_LENGTH) erstellt einen Puffer einer bestimmten Länge (1024 in Ihrem Fall) und füllt diesen Puffer mit NULL-Zeichen (wie dokumentiert here).

Als nächstes lesen Sie einige (sagen wir 2) Bytes von stdin in diesen Puffer, der die ersten zwei dieser NULL-Zeichen durch die von stdin gelesenen Zeichen ersetzt. Der Rest des Puffers besteht immer noch aus NULL.

Wenn Sie den Puffer nicht auf die Anzahl der gelesenen Bytes abschneiden, gibt Ihre Funktion einen Puffer der Länge 1024 zurück, der meistens mit NULL gefüllt ist. Da diese nicht druckbar sind, erscheinen sie nicht in der ersten console.log(), aber sie sind immer noch da.

So, nachdem sie von stdin lesen, sollten Sie den Puffer auf die richtige Größe gestutzt:

let bytesRead = fs.readSync(stdin, buffer, 0, BUFFER_LENGTH); 
buffer = buffer.slice(0, bytesRead); 
Verwandte Themen