通过nodejs中的stdin / stdout流uint8

问题描述 投票:-1回答:1

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

脚本in.js,将2个整数发送到stdout

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
node.js stream pipe buffer
1个回答
0
投票

将编码设置为二进制会破坏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');
  }
});
© www.soinside.com 2019 - 2024. All rights reserved.