我有两个简单的节点脚本,我希望通过bash将它们一起传送。我想从一个脚本向另一个脚本流式传输2个整数。移至下一位时出现问题,例如如果我理解正确的话,可以7位表示127,而128需要8位。我的猜测是,它与整数的符号有关,例如加号或减号。由于这个原因,我专门使用了writeUInt8
和readUInt8
...
脚本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
将编码设置为二进制会破坏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');
}
});