CryptoJS.enc.Base64.stringify和window.btoa处理Uint8Array不一致的问题
浏览器端对字符串进行gzip压缩。
通过查找,发现https://github.com/nodeca/pako 这个库可以实现。
遇到的问题:
通过pako,gzip字符串之后,生成base64,使用window.btoa 和 CryptoJS.enc.Base64.stringify的结果不一致。
import { gzip } from 'pako';
import CryptoJS from 'crypto-js/core';
// 通过gzip之后生成的是 Uint8Array
const f = gzip('abc', { to: 'string' });
const wa = CryptoJS.lib.WordArray.create(f);
const jmStr = CryptoJS.enc.Base64.stringify(wa);
const jmStr1 = window.btoa(f);
// 结果 jmStr != jmStr1.
于是看了下这两者的区别,参考链接。
WordArray的这个对象具有toString()方法,所以在js中是可以直接隐式转换成字符串的,但是默认是Hex编码(16进制)
window.btoa处理入参视为是UTF8编码,CryptoJS.enc.Base64.stringify则是处理的WordArray的16进制。
所以最终正确处理:
CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(f));