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));