Node.js将缓冲区转换为Int8Array

时间:2014-10-07 07:06:32

标签: javascript node.js buffer blob

在客户端,我正在将TypedArray转换为Blob并传输到服务器,以检查数据是否正确,我想比较客户端和服务器端的前五个值,

在客户端:

var fileReader = new FileReader();
fileReader.onload = function() {
    callback(new Int8Array(this.result));
};
fileReader.readAsArrayBuffer(blob);

(我从中读取了回调fn中的前五个值)

但是在服务器上,我找到了将blob转换为缓冲区的代码,根据我的理解,bufferarraybuffer不一样,         var buffer1 = new Buffer( blob, 'binary' );

缓冲区是否与arraybuffer的DataView类似,现在如何将buffer1的前5个值读作我在客户端可以执行的整数?

2 个答案:

答案 0 :(得分:3)

要回答原始问题,可以使用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

答案 1 :(得分:2)

Node Buffer目前完全基于Uint8Array。您可以使用Unt8Array实例执行的所有操作都可以使用Buffer实例。甚至更多,因为Buffer增加了额外的功能和属性。在内部,当必须创建Buffer实例时,它们实际上创建了一个Uint8Array实例,然后将其原型设置为Node Buffer原型。因此,您可以使用buffer1.buffer等访问基础ArrayBuffer。