Javascript UINT8阵列到阵列缓冲区

Javascript UINT8阵列到阵列缓冲区,javascript,Javascript,因此,我有一个ArrayBuffer,它是我用新的HTML5文件读取器作为ArrayBuffer()读取的一个文件的文件内容,我可以通过执行以下操作将ArrayBuffer转换为Uint8Array //ab = established and defined ArrayBuffer var foobar = new Uint8Array([ab]); //var reversed = reverseUint8Array(foobar); //reversed should equal

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

//ab = established and defined ArrayBuffer

var foobar = new Uint8Array([ab]);

//var reversed = reverseUint8Array(foobar); 

//reversed should equal ab 
如何将最后一个过程反转回ab

以下是我解密后得到的输出类型:


这是什么样的格式,如何将其转换为blob

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

这意味着,你需要一个接一个地循环它们中的每一个

最快的方法可能是这样:

var buffer = new ArrayBuffer(foobar.length);

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

我找到了一个更简单的方法来获取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
时,重要的是使用
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)
}

只有当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]

明白了,但是当我尝试运行这段代码时,我得到了以下错误Uncaught(在promise中)TypeError:foobar.map不是一个函数(…),我认为Uint8Array在我对它进行加密后被转换为字符串,然后再次解密。在这种情况下,我们应该怎么做?好的,我认为真正的问题是我们如何将BinaryTextData转换为blob?我仍然更愿意使用ArrayBuffers,我觉得它们可能会更好一些。@NickLim很抱歉延迟回答。在问题中,你能举一个更好的例子吗?输出数据是一个PNG文件,而不是一个“加密”文件。您能显示更多代码吗?请小心,当您的数据视图与缓冲区不相等时,这可能会导致意外结果。。。我的回答是,您的dataview是一些数据的视图,因此,如果您没有使用
新dataview(foobar.buffer)
——它的大小总是正确的——那么有一个强有力的论据表明您没有正确使用dataview。