Javascript UINT8阵列到阵列缓冲区
因此,我有一个ArrayBuffer,它是我用新的HTML5文件读取器作为ArrayBuffer()读取的一个文件的文件内容,我可以通过执行以下操作将ArrayBuffer转换为Uint8ArrayJavascript 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
//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。