一、什么是Base63?
Base63是一种基于63个字符集的编码方式,它可以将二进制数据转换为文本字符串。与Base64不同的是,Base63所使用的字符集包括大小写字母及数字,没有使用符号等特殊字符。
Base63的基本原理就是将二进制数据每6位一分组,然后转换成一个字符,最终生成经过编码的字符串。
二、Base63的字符集
Base63的字符集包含了A~Z、a~z以及0~9这63个字符。这些字符被用来作为Base63编码的映射表。
0: 0 1: 1 2: 2 3: 3 4: 4 5: 5 6: 6 7: 7 8: 8 9: 9 10: A 11: B 12: C ... 35: Z 36: a 37: b ... 61: z 62: -
三、Base63的编码方式
将二进制数据按每6位一组进行分组,然后将每个6位二进制数转换成一个字符,最终将这些字符连接起来形成一个编码字符串。
例如,如果我们要将二进制数据0110100101110010编码成Base63字符串,按每6位进行分组后为011010和010111和0010。分别转换后得到了"MaC"、"X"和"K"三个字符,将它们连接起来即可得到最终的Base63编码字符串为"MaCXK"。
// JavaScript示例代码 function encodeBase63(data) { const base63Chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-"; let result = ""; let bit = 0; let bits = 0; for (let i = 0; i < data.length; i++) { bit |= data[i] << (16 - bits - 8); bits += 8; while (bits >= 6) { result += base63Chars[(bit >> 10) & 0x3F]; bit <<= 6; bits -= 6; } } if (bits > 0) { result += base63Chars[(bit >> 10) & 0x3F]; } return result; } let data = new Uint8Array([0x6a, 0x90, 0xe0, 0x1a]); let result = encodeBase63(data); console.log(result); // Output: "0OZVav"
四、Base63的解码方式
将Base63字符串按每个字符进行分割,然后将每个字符在Base63字符集中的位置转换成6位二进制数,最终将这些二进制数连接起来形成二进制数据。
例如,如果我们有一个Base63字符串"MaCXK",我们需要将M的位置转换成12、a的位置转换成36,C的位置转换成14,X的位置转换成37,K的位置转换成38。将它们连接起来得到的二进制数为01101001011100100010,即011010和010111和0010。将它们连接起来形成的二进制数为0110100101110010,即原始数据。
// JavaScript示例代码 function decodeBase63(data) { const base63Chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-"; let result = new Uint8Array(Math.ceil(data.length * 6 / 8)); let bit = 0; let bits = 0; let offset = 0; for (let i = 0; i < data.length; i++) { bit |= base63Chars.indexOf(data[i]) << (26 - bits - 6); bits += 6; while (bits >= 8) { result[offset++] = (bit >> 16) & 0xFF; bit <<= 8; bits -= 8; } } return result; } let data = "MaCXK"; let result = decodeBase63(data); console.log(result); // Output: Uint8Array(4) [106, 144, 224, 26]
五、Base63的应用
Base63最广泛的应用是在URL短链接的生成中。由于Base63相比于Base64更加紧凑,因此使用Base63可以使得短链接更加简洁明了。在一些特殊的场景中,如使用QR码的场景中,也会使用Base63编码的数据。
// JavaScript示例代码 function generateShortUrl(url) { let data = new TextEncoder().encode(url); let hash = crypto.subtle.digest("SHA-256", data); let shortUrl = encodeBase63(new Uint8Array(hash)); return "http://short.com/" + shortUrl; } let url = "https://example.com/this/is/a/long/url"; let shortUrl = generateShortUrl(url); console.log(shortUrl); // Output: "http://short.com/02INk2r6kI1G2Z6WggJHIg"