输出Uint8ClampedArray缓冲区作为字节流

时间:2015-02-11 09:15:21

标签: javascript phantomjs arraybuffer

在PhantomJS脚本中,我有一个Uint8ClampedArray(来自HTML画布的图像数据),我想将其作为字节流输出到stdout。

在Node.js中我会这样做:

buf = new Buffer(...);
process.stdout.write(buf);

我如何在PhantomJS中做同样的事情?

我不能只为每个字节输出String.fromCharCode(),例如String.fromCharCode(255)输出两个字节,而不是一个字节(即128到255之间的任何字节都会输出两个字节)。

2 个答案:

答案 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");