将 Uint8ClampedArray 缓冲区输出为字节流

Output a Uint8ClampedArray buffer as a stream of bytes

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

在Node.js我会做:

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

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

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

打印到控制台的唯一明智的方法是使用 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");

我已经能够使用 fs phantomjs 模块写入 stdout,因此能够写入二进制文件:

var fs = require('fs');
var stream = fs.open('/dev/stdout', 'wb');
stream.write(String.fromCharCode(128));
stream.flush();

出于某种原因,对于大量数据,它仍然很慢。