Как сохранить Uint8array в браузере с локальным хранилищем, используя JavaScript - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть 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.вывод выглядит следующим образом: enter image description here

Как я могу сохранить Uint8array в браузере и получить его таким же образом в другом классе, используя localStorage?заранее спасибо.

1 Ответ

0 голосов
/ 20 сентября 2018

Это сложно ...

Uint8Array - это просто представление ArrayBuffer, представляющего собой двоичные данные, хранящиеся в памяти.
Поэтому мой обычный совет: не храните двоичные данные вlocalStorage , потому что localStorage может хранить только строки и существуют другие API-интерфейсы хранения, которые могут обрабатывать двоичные данные, такие как IndexedDB.



Но вот что вы хотите сохранить:только случайным образом сгенерированные числа, которые вы получили от crypto 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
  : typedArray.map(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);
...