所有字符类型的Javascript文本编码

所有字符类型的Javascript文本编码,javascript,google-chrome-extension,hash,encoding,Javascript,Google Chrome Extension,Hash,Encoding,我目前正在浏览器扩展中编码SHA-256哈希,如下所示: var hash = "arbitraryString"; const hash2 = await crypto.subtle.digest("SHA-256", (hash)); const hashArray = await Array.from(new Uint8Array(hash2)); const hashHex = await hashArray.map(b => b.toString(16).padStart(2,

我目前正在浏览器扩展中编码SHA-256哈希,如下所示:

var hash = "arbitraryString";
const hash2 = await crypto.subtle.digest("SHA-256", (hash));
const hashArray = await Array.from(new Uint8Array(hash2));
const hashHex = await hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
var length = 32;
var hashHexString = hashHex.substring(0,length);
这将生成一个仅由小写字母和数字组成的32位字符串。有没有一种方法可以改变编码或其他方式,从而生成一个包含小写、大写、数字和特殊字符的字符串

在尝试以下操作时:

const hashHex = await hashArray.map(b => b.toString(64).padStart(2, '0')).join('');
我得到这个错误: “RangeError:toString()基数参数必须介于2和36之间”


这是否意味着,如果不添加其他库,我就不能使用这样一个简单的编码函数在javascript(在浏览器扩展中)中创建所需的下限/上限/数字/特殊字符字符串?

看起来您需要一个。既然您对Base16(十六进制)不太熟悉,那么如何?它没有很多特殊字符,但它有大写/小写字母和数字,并且广泛使用(例如,对于数组)。更多的特殊角色有Base85,但已经更具异国情调,也不太受支持。我会推荐Base64,除非特殊字符的出现出于某种原因很重要。谢谢。我按照指南和链接使用Base64[btoa(String.fromCharCode.apply(null,new-Uint8Array(hashArray));],并将最大长度提高到64,以确保获得所有字符类型。编码的字符串是唯一的,总是有上/下/数字,并且总是44个字符长。唯一让我感到奇怪的是最后一个字符总是“=”。这对我来说是一件好事,因为它确保字符串总是有一个特殊的字符,但这与我有关。你能解释一下吗@Topaco您应该仔细阅读Base64规范,以确保编码符合您的目的。Base64将更详细地解释,包括所使用的。唯一允许的特殊字符是/+=其中后者专门用于本节中解释的填充。