缓冲区充满了unicode零

时间:2017-03-15 21:21:15

标签: node.js

我正在尝试从节点中的控制台同步读取参数,我设法执行以下操作:

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*/, '');
}

它有效,但这是一件奇怪的事情:

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....'}

当我将值包装在一个对象中时,剩余的BUFFER位以字符串形式显示。这是为什么?我怎么能摆脱他们?在制作对象之前对字符串进行正则表达式不起作用。

1 个答案:

答案 0 :(得分:1)

Buffer.alloc(BUFFER_LENGTH)创建一个特定长度的缓冲区(在您的情况下为1024),并使用NULL字符填充该缓冲区(如文档here所示)。

接下来,您从stdin读取一些(比方说2个)字节到该缓冲区中,该字节用从stdin读取的字符替换前两个NULL字符。缓冲区的其余部分仍由NULL组成。

如果你不将缓冲区截断为读取的字节数,你的函数将返回一个长度为1024的缓冲区,大部分都填充了NULL' s。由于这些不可打印,因此它们不会出现在第一个console.log()中,但它们仍然存在。

因此,从stdin读取后,您应该将缓冲区截断为正确的大小:

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