Node.js将缓冲区转换为Int8Array

4
在客户端,我将一个TypedArray转换为Blob并传输到服务器。为了检查数据是否正确,我想要比较客户端和服务器端的前五个值。
在客户端:
var fileReader = new FileReader();
fileReader.onload = function() {
    callback(new Int8Array(this.result));
};
fileReader.readAsArrayBuffer(blob);

(从中我在回调函数中读取前五个值)
但是在服务器上,我发现了将Blob转换为Buffer的代码,并且据我所知,bufferarraybuffer不同, var buffer1 = new Buffer( blob, 'binary' ); 缓冲区是否有类似于DataView的arraybuffer,现在我如何阅读buffer1的前5个值作为整数,就像我在客户端那样做?
2个回答

9
为了回答这个问题,你可以使用Buffer实例的buffer属性来获取ArrayBuffer,然后基于它实例化一个Uint8Array。
function viewBufferAsUint8Array(buf) {
    return new Uint8Array(buf.buffer);
}

注意:Uint8Array和ArrayBuffer将占用相同的内存,因此对其中一个所做的更改会导致对另一个的更改。以下代码将把内容复制到一个新的不与缓冲区链接的Uint8Array中:

function copyBufferToSeparateUint8Array(buf, truncateSizeTo) {
    var orig = new Uint8Array( buf.buffer );
    if (!truncateSizeTo) return new Uint8Array( orig );
    
    var copy = new Uint8Array( truncateSizeTo );
    copy.set( orig );
    return copy;
}

虽然将缓冲区复制到单独的 Uint8Array 中略微慢一些,但它具有让用户选择新 Uint8Array 大小的附加优点。

用例:

var buf = Buffer.alloc(4);
buf[0] = buf[1] = buf[2] = buf[3] = 45;

var asU8Array = viewBufferAsUint8Array( buf );

var copiedU8 = copyBufferToSeparateUint8Array( buf );

asU8Array[2] = 120;

console.log( buf[2] );       // 120
console.log( asU8Array[2] ); // 120
console.log( copiedU8[2] );  // 45

8

Node Buffer目前完全基于Uint8Array。您可以使用Buffer实例执行Uint8Array实例的所有操作,甚至更多,因为Buffer添加了其他函数和属性。在内部创建Buffer实例时,它们实际上会创建一个Uint8Array实例,然后将其原型设置为Node缓冲区原型。因此,您可以使用buffer1.buffer等访问底层ArrayBuffer。


已点赞,但如果您能提供一些示例代码来扩展答案,那就太好了 :) - mido
1
感谢您的点赞。实际上,我不是一名 JavaScript 开发者,而是一名编写 C++ 扩展模块的开发者。我对 V8、libuv 和 Node.js 的 C++ 代码部分有所了解。我查看了 Node.js 缓冲区的内部实现,并希望通过分享我所看到的内容来帮助大家。但我认为如果了解这些信息,JavaScript 部分会更容易理解。 - Viruslav
提供一个链接让其他人检查代码会很不错。我想这个链接足够了:https://github.com/nodejs/node/blob/v17.7.1/lib/buffer.js#L344 - YakovL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接