在这样一个场景下: 如果一个对象总包含了一个Uint8Array对象,如果执行了JSON.stringify()序列化对象之后,Uint8Array对象被转换成了下标映射到值的一个字典,这样导致的第一个问题是序列化之后的字符串会很长,第二个问题是无法通过JSON.parse()反序列化为原来的Uint8Array对象。那么此时将Uint8Array转换为普通数组对象和字符串对象,就能很便于做序列化与反序列化处理。
Uint8Array对象与16进制字符串的相互转换
const fromHexString = hexString =>
new Uint8Array(hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16)));
const toHexString = bytes =>
bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');
console.log(toHexString(new Uint8Array([0, 1, 2, 42, 100, 101, 102, 255])))
console.log(fromHexString('0001022a646566ff'))
输出:
> "0001022a646566ff"
> Uint8Array [0, 1, 2, 42, 100, 101, 102, 255]
Uint8Array与数组对象的相互转换
var uintAry = new Uint8Array([0, 1, 2, 42, 100, 101, 102, 255]);
console.log(uintAry);
console.log(JSON.stringify(uintAry)); console.log();
var aryObj = Array.from(uintAry);
console.log(aryObj);
console.log(JSON.stringify(aryObj)); console.log();
var ary = [7,5,6,3,7,3];
var uintAryFromAry = new Uint8Array(ary);
console.log(uintAryFromAry);
console.log(JSON.stringify(uintAry)); console.log();
输出:
> Uint8Array [0, 1, 2, 42, 100, 101, 102, 255]
> "{"0":0,"1":1,"2":2,"3":42,"4":100,"5":101,"6":102,"7":255}"
>
> Array [0, 1, 2, 42, 100, 101, 102, 255]
> "[0,1,2,42,100,101,102,255]"
>
> Uint8Array [7, 5, 6, 3, 7, 3]
> "{"0":0,"1":1,"2":2,"3":42,"4":100,"5":101,"6":102,"7":255}"
>