所以我有一个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中?
答案 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
时,重要的是使用byteOffset
和byteLength
计算实际数据
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]