Uint8Array到Array Buffer

时间:2016-05-14 15:08:57

标签: javascript

所以我有一个ArrayBuffer,它是我用新的HTML5文件阅读器作为ArrayBuffer()读取的文件的文件内容,我可以通过执行以下操作将ArrayBuffer转换为Uint8Array。

//ab = established and defined ArrayBuffer

var foobar = new Uint8Array([ab]);

//var reversed = reverseUint8Array(foobar); 

//reversed should equal ab 

如何将最后一个流程转回ab?

以下是解密后我得到的输出类型:http://prntscr.com/b3zlxr

这是什么类型的格式,如何将其添加到blob中?

4 个答案:

答案 0 :(得分:29)

我找到了一个更简单的方法来获取Uint8Array的ArrayBuffer。

var arrayBuffer = foobar.buffer; 
只是这个! 它对我有用!

答案 1 :(得分:5)

使用kuokongqingyun选项时,由于缓冲区可能大于数据视图,因此它并不总是有效。

请参见以下示例:

let data = Uint8Array.from([1,2,3,4])
var foobar = data.subarray(0,2)
var arrayBuffer = foobar.buffer; 

console.log(new Uint8Array(arrayBuffer)) // will print [1,2,3,4] but we want [1,2]

使用array.buffer时,重要的是使用byteOffsetbyteLength计算实际数据

let data = Uint8Array.from([1,2,3,4])
var foobar = data.subarray(0,2)
var arrayBuffer = foobar.buffer.slice(foobar.byteOffset, foobar.byteLength + foobar.byteOffset); 

console.log(new Uint8Array(arrayBuffer)) // OK it now prints [1,2]

这是您需要的功能:

function typedArrayToBuffer(array: Uint8Array): ArrayBuffer {
    return array.buffer.slice(array.byteOffset, array.byteLength + array.byteOffset)
}

答案 2 :(得分:3)

如果您需要将其转换回ArrayBuffer(),则需要手动添加每个值。

这意味着,您需要逐个遍历每一个。

可能最快的方式是这样的:

var buffer = new ArrayBuffer(foobar.length);

foobar.map(function(value, i){buffer[i] = value});

答案 3 :(得分:0)

这里的某些答案仅在您的 Uint8Array 的内部缓冲区没有偏移时才有效。使用 .slice() 的答案将制作一个并不总是需要的昂贵的内存副本。

最简单有效的方法是这样的:

var buffer = new ArrayBuffer(foobar.buffer, foobar.byteOffset, foobar.byteLength);

示例:

let data = Uint8Array.from([1,2,3,4])
let foobar = data.subarray(1,3) // [2, 3]

console.log(new Uint8Array(foobar.buffer, foobar.bytesOffset, foobar.byteLength).toString()) // will print [2, 3]