将 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();
出于某种原因,对于大量数据,它仍然很慢。
在 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()
.
此外,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();
出于某种原因,对于大量数据,它仍然很慢。