一、什么是Base63?
Base63是一種基于63個(gè)字符集的編碼方式,它可以將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為文本字符串。與Base64不同的是,Base63所使用的字符集包括大小寫字母及數(shù)字,沒有使用符號(hào)等特殊字符。
Base63的基本原理就是將二進(jìn)制數(shù)據(jù)每6位一分組,然后轉(zhuǎn)換成一個(gè)字符,最終生成經(jīng)過編碼的字符串。
二、Base63的字符集
Base63的字符集包含了A~Z、a~z以及0~9這63個(gè)字符。這些字符被用來作為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的編碼方式
將二進(jìn)制數(shù)據(jù)按每6位一組進(jìn)行分組,然后將每個(gè)6位二進(jìn)制數(shù)轉(zhuǎn)換成一個(gè)字符,最終將這些字符連接起來形成一個(gè)編碼字符串。
例如,如果我們要將二進(jìn)制數(shù)據(jù)0110100101110010編碼成Base63字符串,按每6位進(jìn)行分組后為011010和010111和0010。分別轉(zhuǎn)換后得到了"MaC"、"X"和"K"三個(gè)字符,將它們連接起來即可得到最終的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字符串按每個(gè)字符進(jìn)行分割,然后將每個(gè)字符在Base63字符集中的位置轉(zhuǎn)換成6位二進(jìn)制數(shù),最終將這些二進(jìn)制數(shù)連接起來形成二進(jìn)制數(shù)據(jù)。
例如,如果我們有一個(gè)Base63字符串"MaCXK",我們需要將M的位置轉(zhuǎn)換成12、a的位置轉(zhuǎn)換成36,C的位置轉(zhuǎn)換成14,X的位置轉(zhuǎn)換成37,K的位置轉(zhuǎn)換成38。將它們連接起來得到的二進(jìn)制數(shù)為01101001011100100010,即011010和010111和0010。將它們連接起來形成的二進(jìn)制數(shù)為0110100101110010,即原始數(shù)據(jù)。
// 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的應(yīng)用
Base63最廣泛的應(yīng)用是在URL短鏈接的生成中。由于Base63相比于Base64更加緊湊,因此使用Base63可以使得短鏈接更加簡(jiǎn)潔明了。在一些特殊的場(chǎng)景中,如使用QR碼的場(chǎng)景中,也會(huì)使用Base63編碼的數(shù)據(jù)。
// 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"