将Uint8ClampedArray缓冲区作为字节流输出

Output a Uint8ClampedArray buffer as a stream of bytes

本文关键字:字节流 输出 Uint8ClampedArray 缓冲区      更新时间:2023-09-26

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

在Node.js中我会做:

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

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

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

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

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

由于某种原因,对于大量数据来说,它仍然相当慢。

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