在客户端,我正在将TypedArray转换为Blob并传输到服务器,以检查数据是否正确,我想比较客户端和服务器端的前五个值,
在客户端:
var fileReader = new FileReader();
fileReader.onload = function() {
callback(new Int8Array(this.result));
};
fileReader.readAsArrayBuffer(blob);
(我从中读取了回调fn中的前五个值)
但是在服务器上,我找到了将blob转换为缓冲区的代码,根据我的理解,buffer
和arraybuffer
不一样,
var buffer1 = new Buffer( blob, 'binary' );
缓冲区是否与arraybuffer的DataView
类似,现在如何将buffer1
的前5个值读作我在客户端可以执行的整数?
答案 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。