如何使用 javascript 在浏览器中使用 localstorage 存储 Uint8array

Posted

技术标签:

【中文标题】如何使用 javascript 在浏览器中使用 localstorage 存储 Uint8array【英文标题】:How to Store Uint8array in the browser with localstorage using javascript 【发布时间】:2019-02-24 10:40:47 【问题描述】:

我有 16 个字节的数据存储在 Uint8Array 中。我需要将这些数据存储在浏览器中,并且必须在其他类中获取它。

所以我的代码如下所示:

const ivBytes = window.crypto.getRandomValues(new Uint8Array(16));
localStorage.setItem("iv",JSON.stringify(ivBytes))
console.log("content of ivBytes:" + ivBytes)

在其他课程中,我尝试获取这样的数据,但它不起作用

let array = JSON.parse(localStorage.getItem("iv"))
console.log("the iv value we get is: " + ivBytes)

但是当我尝试获取数组的内容时,它并没有准确地给我 ivBytes 的内容。输出如下:

如何在浏览器中存储 Uint8array 并使用 localStorage 在其他类中以相同的方式获取它?提前致谢。

【问题讨论】:

我在firefox中尝试时可以看到您保存和检索的本地存储数据是相同的。请同时发布您的输出。 @KrishnadasPC 我刚刚做到了!感谢您的意见! 或者使用专门设计用于将二进制数据以紧凑形式存储为字符串的 Base-64。不幸的是,内置的 atob 和 btoa 函数在这里不会受到影响,因此这种方法需要自定义实现。 【参考方案1】:

很难……

Uint8Array 只是 ArrayBuffer 的视图,ArrayBuffer 是内存中保存的二进制数据。 所以我的一般建议是不要在 localStorage 中存储二进制数据,因为 localStorage 只能存储字符串,而且还有其他存储 API 可以处理二进制数据,例如 IndexedDB。



但是,这里你想要存储的似乎只是你从加密 API 获得的随机生成的数字,而且由于它是我们正在谈论的非常小的 ArrayBuffer,那么......

要对您的 TypedArray 进行字符串化以便将其存储在 localStorage 中,您需要一个一个地提取所有值并将它们移动到一个数组中,或者,如果可用,只需调用 Array.from(yourTypedArray) 然后将此数组字符串化:

const typedArray = new Uint8Array(16);
crypto.getRandomValues(typedArray);
const arr = Array.from // if available
  ? Array.from(typedArray) // use Array#from
  : [].map.call(typedArray, (v => v)); // otherwise map()
// now stringify
const str = JSON.stringify(arr);
console.log(str);
// localStorage.setItem('foo', str);

// and to retrieve it...
// const str = localStorage.getItem('foo');
const retrievedArr = JSON.parse(str);
const retrievedTypedArray = new Uint8Array(retrievedArr);
console.log(retrievedTypedArray.byteLength);

【讨论】:

非常感谢,您能否在第 3 行定义您对这个 const 数组以及我们和 str && Json 解析 (Str) 步骤时做了什么?它对我来说有点先进..非常感谢 对于arr = 部分,它是一个三元运算符。它首先检查 Array.from 是否存在,然后使用它,否则使用 TypedArray.map。对于str && JSON.parse(...,它实际上没用;-)(是为了避免可能出现JSON.parse(null),但这不会抛出,所以我会删除它。 这比将其转换为十六进制的存储效率要低,不是吗?

以上是关于如何使用 javascript 在浏览器中使用 localstorage 存储 Uint8array的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JavaScript 在 Web 浏览器中查找尺寸 [重复]

如何使用 Javascript/JQuery 在移动浏览器中限制点运算符('.')

使用 JavaScript 刷新浏览器后如何在一个页面网站中保存部分位置?

如何使用移动浏览器调试 JavaScript 代码

如何通过javascript或jquery将输入字段聚焦在Android浏览器上

如何使用 Javascript 启用浏览器 cookie? [复制]