gpt4 book ai didi

javascript - 如何使用 ES6 代理 ArrayBuffer 或 Uint8Array?

转载 作者:行者123 更新时间:2023-11-29 11:01:19 30 4
gpt4 key购买 nike

这些工作:

crypto.subtle.digest('SHA-512', new Uint8Array([0]))
crypto.subtle.digest('SHA-512', new Uint8Array([0]).buffer)

这些不会:

crypto.subtle.digest('SHA-512', new Proxy(new Uint8Array([0]),{}))
crypto.subtle.digest('SHA-512', new Proxy(new Uint8Array([0]).buffer,{})

错误:

无法在“SubtleCrypto”上执行“digest”:提供的值不是“(ArrayBuffer 或 ArrayBufferView)”类型

instanceof Uint8Arrayinstanceof ArrayBuffer 在这两种情况下都返回 true。

最佳答案

digest is specified by its IDL interface只接受一个 BufferSource,即 either an ArrayBufferView or an ArrayBuffer .这种 IDL 级类型表明正确的实现将断然拒绝任何不具有正确内部类型的输入。

您可能想使用 Proxy 的任何技巧都不会在 digest 上起作用。相反,您可以在将数据传递给 digest 之前立即使用代理技巧来获取您想要的确切 ArrayBuffer

例如,这里有一个代理,它伪造了一个不同于其内部对象上的 bufferbufferbuffer 是真实的,所以它可以传递到 digest 中,但它是由 Proxy 魔法创建的:

var proxy = new Proxy(new Uint8Array([0]), {
get:function(obj, prop) {
if(prop=="buffer"){ return new Uint8Array([42]).buffer }
else { return obj[prop]; }
}
});
crypto.subtle.digest('SHA-512', proxy.buffer)

如果无法生成缓冲区(例如,如果它太大而无法放入 RAM),您目前将不得不依赖 SubtleCrypto 以外的其他东西。

这似乎是 W3C 提出的一个很好的观点,例如,支持 update 机制来迭代收集输入。

关于javascript - 如何使用 ES6 代理 ArrayBuffer 或 Uint8Array?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46609154/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com