在PhantomJS脚本中,我有一个Uint8ClampedArray
(来自HTML画布的图像数据),我想将其作为字节流输出到stdout。
在Node.js中我会这样做:
buf = new Buffer(...);
process.stdout.write(buf);
我如何在PhantomJS中做同样的事情?
我不能只为每个字节输出String.fromCharCode()
,例如String.fromCharCode(255)
输出两个字节,而不是一个字节(即128到255之间的任何字节都会输出两个字节)。
答案 0 :(得分:1)
我已经能够使用fs
phantomjs模块写入stdout,因此可以写为二进制文件:
var fs = require('fs');
var stream = fs.open('/dev/stdout', 'wb');
stream.write(String.fromCharCode(128));
stream.flush();
由于某种原因,大量数据仍然很慢。
答案 1 :(得分:0)
打印到控制台的唯一合理方法是使用console.log()
。缺点是每次调用时都会插入换行符,因此您无法单独打印每个字符。您必须构建一个字符串并在之后打印它。如您所述,您可以使用String.fromCharCode()
将每个字节转换为char。
此外,Uint8ClampedArray.prototype.join()
等功能尚未实施。
var a = new Uint8ClampedArray([37, 38, 39]);
console.log([].map.call(a, function(v){
return String.fromCharCode(v);
}).join());
请注意,Uint8ClampedArray
在PhantomJS 1.x中不可用。
console.log()
不能在二进制模式下工作,因此在打印时会将127个代码点上方的字符拆分为两个字节。这仅在打印时发生。您可以查看
String.fromCharCode(147).length; // 1
如果您愿意编写文件,可以使用fs模块将其写入二进制文件:
var a = new Uint8ClampedArray([37, 38, 39]),
fs = require('fs');
var b = [].map.call(a, function(v){
return String.fromCharCode(v);
}).join("");
fs.write("img.dat", b, "wb");