Base64是一種能將任意Binary資料用64種字元組合成字串的方法,而這個Binary資料和字串資料彼此之間是可以互相轉換的,十分方便。在實際應用上,Base64除了能將Binary資料可視化之外,也常用來表示資料加密過後的內容。然而,標準版本的Base64對於URL或是檔案路徑來說可能不是那麼的友善,因為編碼後的Base64資料可能有+
或是/
這兩種字元。為了解決這個問題,Base64有個變體稱作「Base64-URL」,會將字元+
對應到字元-
(減號),字元/
對應到字元_
(底線),且用來padding的=
字元通常為了節省長度而會被省略。
舉例來說,
以上的這個標準版本的Base64字串,可以轉成如下的「Base64-URL」字串:
轉換之後的字串可以無痛被使用在URL/URI或是檔案路徑中。
有關Base16、Base32、Base64的定義,可以查閱RFC4648。
Base64 URL
「Base64 URL」是筆者開發的套件,可以用來將任意資料編碼成Base64-URL字串,或是將Base64-URL字串解碼回原始資料。也可以將現有的Base64字串轉成Base64-URL字串,或是將現有的Base64-URL字串轉成Base64字串。
Crates.io
Cargo.toml
使用方法
若要將任意資料編碼成Base64-URL字串,可以使用encode
關聯函數。
assert_eq!("SGVsbG8sIHdvcmxkIQ", base64_url::encode("Hello, world!"));
若要將Base64-URL字串解碼回原始資料,可以使用decode
關聯函數。
assert_eq!(b"Hello, world!", base64_url::decode("SGVsbG8sIHdvcmxkIQ").unwrap().as_slice());
若要將現有的Base64字串轉成Base64-URL字串,可以使用escape
關聯函數。這個函數並不會花費運算資源去檢查Base64字串的正確性。
assert_eq!("SGVsbG8sIHdvcmxkIQ", base64_url::escape("SGVsbG8sIHdvcmxkIQ=="));
若要將現有的Base64-URL字串轉成Base64字串,可以使用unescape
關聯函數。這個函數並不會花費運算資源去檢查Base64-URL字串的正確性。
assert_eq!("SGVsbG8sIHdvcmxkIQ==", base64_url::unescape("SGVsbG8sIHdvcmxkIQ"));
另外還有其它的encode_*
、decode_*
、escape_*
、unescape_*
關聯函數,可以用在特定的場合。例如:
let hash = &[1, 2, 3, 4, 5, 6, 7, 8, 9];
let url = String::from("https://example.com/?hash=");
assert_eq!("AQIDBAUGBwgJ", base64_url::encode_to_string(hash, &mut url));
assert_eq!("https://example.com/?hash=AQIDBAUGBwgJ", url);