繁体   English   中英

Uint8Array 到 ArrayBuffer

[英]Uint8Array to ArrayBuffer

所以我有一个 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?

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

var arrayBuffer = foobar.buffer; 

只是这个! 它对我有用!

使用 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)
}

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

这意味着,您需要一个一个地循环浏览它们中的每一个。

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

var buffer = new ArrayBuffer(foobar.length);

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

这里的一些答案只有在 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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM