Uint8Array 转换成 ArrayBuffer

63

我有一个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格式?


输出数据是一个PNG文件,而不是一个"加密"文件。你能展示更多的代码吗? - Ismael Miguel
我希望能够修正你的代码。对于相同的转换,应该是 var foobar = new Uint8Array(ab); - undefined
4个回答

80

我发现了一种更简单的方法来获取Uint8Array的ArrayBuffer。

var arrayBuffer = foobar.buffer; 

就是这样! 而且这对我有效!


22
请注意,当您的数据视图与缓冲区不相等时,可能会导致意外结果...请查看我的答案。 - Stéphane
2
话说,你的数据视图是一些数据的视图,所以如果你没有使用 new DataView(foobar.buffer) -- 这总是正确的大小 -- 那么有一个很强的论点可以证明你没有正确地使用 DataView。 - Mike 'Pomax' Kamermans

70

仅使用.buffer并不总是有效的,因为缓冲区可能比数据视图大。

看这个例子:

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

1
什么是 foobar?请使用真实的变量名,这有助于其他人理解您的意图。 - mikemaccana

1

TypedArray 的 buffer 属性是一个 ArrayBuffer

new Uint8Array(4).buffer // ArrayBuffer(4)

-1

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

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

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

var buffer = new ArrayBuffer(foobar.length);

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

我仍然更愿意使用ArrayBuffers,我觉得它们可能会更好一些。 - Lao Tzu
1
@NickLim,很抱歉回复晚了。您能否在问题中展示一个更好的例子? - Ismael Miguel
我会发布我得到的输出类型,也许你可以向我展示如何将该数据解析成一个 blob。 - Lao Tzu
好的,这是真正的问题。我该如何将ArrayBuffer转换为字符串,以便我可以加密/解密,然后将文本重新组合成完全相同的ArrayBuffer? - Lao Tzu
有多种类型的ArrayBuffers吗?这似乎是这样的,也许您的方法对我的数据不适用。 - Lao Tzu
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接