通过Node.js中的stdin / stdout流uint8

时间:2019-12-13 20:29:18

标签: node.js stream pipe buffer

我有两个简单的节点脚本,我希望将它们以bash的形式发送到一起。我想从一个脚本向另一个脚本流式传输2个整数。移至下一位时出现问题,例如如果我理解正确的话,可以7位表示127,而128需要8位。我的猜测是,它与整数的符号有关,例如加号或减号。由于这个原因,我专门使用了writeUInt8readUInt8 ...

脚本 in.js ,向 stdout 发送2个整数:

process.stdout.setEncoding('binary');

const buff1 = Buffer.alloc(1);
const buff2 = Buffer.alloc(1);

buff1.writeUInt8(127);
buff2.writeUInt8(128);

process.stdout.write(buff1);
process.stdout.write(buff2);

process.stdout.end();

脚本 out.js ,从 stdin 读取并再次写入 stdout

process.stdin.setEncoding('binary');
process.stdin.on('data', function(data) {
    for(const uInt of data) {
        const v = Buffer.from(uInt).readUInt8();
        process.stdout.write(v + '\n');
    }
});

在bash中,我连接进出:

$ node in.js | node out.js

预期结果:

127
128

实际结果:

127
194

1 个答案:

答案 0 :(得分:1)

将编码设置为二进制会破坏 in.js 中的接收数据。

根据Readable Stream documentation of Node.js

  

默认情况下,未分配任何编码,并且将返回流数据   作为Buffer个对象。

我测试了下面的代码,它可以正常工作:

// in.js
process.stdin.on('data', function (data) {
  for (let i = 0; i < data.length; ++i) {
    const v = data.readUInt8(i);
    process.stdout.write(v + '\n');
  }
});