使用方法
- 輸入字母表,或選擇一個預設後再修改。每個字元只能出現一次。
- 選擇方式:「大數轉換」適用於任意長度的字母表,「位分組」適用於 2、4、8、16、32 或 64 個字元的字母表。
- 使用按位分組時,可以另外指定一個不在字母表中的填充字元。
- 輸入文字進行編碼,或貼上用該字母表寫成的字串進行解碼。
把位元組對映為字元的兩種方式
大數方式與 Base58 相同:把整個輸入看作一個大整數,反覆除以字母表長度,每次的餘數決定一個字元。只要字母表至少有 2 個字元就能使用,10、36、58、62 等任意長度都可以。開頭的零位元組會寫成字母表的第一個字元,因此往返轉換不會丟失。這種方式沒有填充;由於長資料的運算會很慢,輸入最多約 20 KB。
按位分組方式與 RFC 4648 相同:把輸入切成固定位數的小塊,2 個字元的字母表每塊 1 位,16 個字元每塊 4 位,32 個字元每塊 5 位,64 個字元每塊 6 位。每一塊的值就是字母表中的下標。十六進位、Base32 和 Base64 正是這樣工作的,輸出長度只取決於輸入長度。
為什麼兩種方式的結果不同
一種方式編碼的是資料的數值,另一種方式按位置逐段編碼資料的位元。兩者的結果通常不同,解碼時必須使用編碼時的方式。
| 字母表 | 輸入 | 按位分組 | 大數 |
|---|---|---|---|
| 標準 Base64 | Hi | SGk= | Ehp |
| RFC 4648 Base32 | Hi | JBUQ==== | SDJ |
01 | A | 01000001 | 1000001 |
0123456789 | Hi | 不支援 | 18537 |
使用按位分組並以 = 作為填充字元時,標準字母表得到的就是常規的 Base64 和 Base32。大數方式寫出的是數值而不是固定位數,所以 A 開頭的那個 0 位被省略了。以十個數字作為字母表時,結果就是 Hi 這兩個位元組對應的十進位數。
填充字元只對按位分組有效:64 個字元的字母表會把輸出補足到 4 的倍數,32 個和 8 個字元的字母表補足到 8 的倍數。2、4、16 個字元的字母表中,每個位元組都正好佔滿整數個字元,因此永遠不需要填充。
合法字母表的規則
- 至少 2 個字元。
- 不能有重複字元。解碼時每個字元必須對應唯一的值。如果
a同時代表 0 和 10,含有它的字串就無法解碼。 - 區分大小寫。
a和A是兩個不同的字元。 - 填充字元不能出現在字母表中,否則無法與資料區分。
編碼和解碼都在瀏覽器中進行,字母表和資料都不會離開你的裝置。
自定義字母表的用途
常見問題
「大數轉換」和「位分組」有什麼區別?
大數方式像 Base58 一樣,把整個輸入當作一個整數轉換到新進位,適用於任意長度的字母表。按位分組方式像 Base64 一樣,把輸入切成固定位數的小塊,字母表必須是 2、4、8、16、32 或 64 個字元。
為什麼我的自定義 Base64 字母表得不到標準 Base64 的結果?
標準 Base64 使用的是按位分組。選擇「位分組」並把填充字元設為 =,結果就會一致。同一個字母表用大數方式會得到完全不同的字串。
為什麼不允許重複字元?
每個字元解碼時必須對應唯一的值。重複的字元會有兩種含義,原始資料就無法可靠地還原。
大數方式可以使用填充字元嗎?
不可以。大數方式的輸出沒有固定的分組長度,也就無需填充。填充選項只對按位分組有效。
自定義字母表算是加密嗎?
不算。它仍然是一種沒有金鑰的編碼。打亂的字母表能讓資料不那麼容易被一眼認出,但絕不應該用來保護機密資訊。