[C#] Base64 Convert.ToBase64String 基本轉碼及適用網址參數轉碼延伸應用
這次示範一個 C# 內將字串轉為 Base64 字串的語法,並利用此轉換方法延伸到適用網址上傳遞參數的改法
什麼是 Base64
Base64 是一組基於 64 個可列印字元的索引轉換表。在 Base64 中的可列印字元包括字母 A-Z、a-z、數字 0-9,再加上範號 + / 組成 64 個索引字元。
Base64索引表
來源: 維基百科
在 C# 中可以將任何字串經由 Encoding.UTF8.GetBytes 即可取得 2 進位的編碼,再將此 2 進位對應 Base64 索引編碼就可以換成為 Base64 字串。
取得字串的 2 進位編碼 (Bytes) 有多種方法,主要選擇不同字元集編碼,例如:UTF8, ASCII 或其他字元集編碼均可,但我建議使用 UTF8 編碼,這樣可支援的文字更多。
範例 1: ToBase64String 基本轉碼
先看一下此範例輸出的結果
來看看程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
StringBuilder sbSample = new StringBuilder(); string inputText = "Test中文"; // 來源文字 sbSample.Append("原始文字: " + inputText + "<br>"); // 轉換 Byte[] bytesEncode = System.Text.Encoding.UTF8.GetBytes(inputText); //取得 UTF8 2進位 Byte string resultEncode = Convert.ToBase64String(bytesEncode); // 轉換 Base64 索引表 sbSample.Append("Base 64 轉換結果: " + resultEncode + "<br>"); // 還原 Byte[] bytesDecode = Convert.FromBase64String(resultEncode); // 還原 Byte string resultText = System.Text.Encoding.UTF8.GetString(bytesDecode); // 還原 UTF8 字元 sbSample.Append("還原結果: " + resultText); // 輸出網頁 ViewBag.resultText = sbSample.ToString(); |
範例 2: ToBase64String 適用網址參數轉碼
這個範例是第 1 個範例的延伸應用,因為在 Base64 轉換後的字元中有 = + / 等字元,= + / 這些字元不適合直接放在網址中當參數傳遞,會與網址的關鍵字重複導致判斷錯誤,如果要將轉換結果放至網址中當參數使用,需要做一些修改。
先看一下這次修改的範例畫面
這次範例中轉換後的 Base64 少了後面兩個 ==
可是當轉換回原本字元時並不影響結果,那是因為 == 是為了滿足 Base64 足夠位元數計算而加上去的,只要了解原理就可以在轉碼網址參數上先隱藏,待解碼時再加回來。
在網址中還有 + / 都會影響判斷,只要在編碼時取代掉,待解碼時轉換回來即可。
來看看這次修改的程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
StringBuilder sbSample = new StringBuilder(); string inputText = "Test中文"; // 來源文字 sbSample.Append("原始文字: " + inputText + "<br>"); // 網址參數轉換 Byte[] bytesEncode = System.Text.Encoding.UTF8.GetBytes(inputText); //取得 UTF8 2進位 Byte string resultEncode = Convert.ToBase64String(bytesEncode); // 轉換 Base64 索引表 resultEncode = resultEncode.Split('=')[0]; // Remove any trailing '='s resultEncode = resultEncode.Replace('+', '-'); // 62nd char of encoding resultEncode = resultEncode.Replace('/', '_'); // 63rd char of encoding sbSample.Append("Base 64 轉換結果: " + resultEncode + "<br>"); // 還原 resultEncode = resultEncode.Replace('-', '+'); // 62nd char of encoding resultEncode = resultEncode.Replace('_', '/'); // 63rd char of encoding switch (resultEncode.Length % 4) // Pad with trailing '='s { case 0: break; // No pad chars in this case case 2: resultEncode += "=="; break; // Two pad chars case 3: resultEncode += "="; break; // One pad char default: throw new ArgumentOutOfRangeException( nameof(resultEncode), "Illegal base64url string!"); } Byte[] bytesDecode = Convert.FromBase64String(resultEncode); // 還原 Byte string resultText = System.Text.Encoding.UTF8.GetString(bytesDecode); // 還原 UTF8 字元 sbSample.Append("還原結果: " + resultText); ViewBag.resultText = sbSample.ToString(); // 輸出網頁 ViewBag.resultText = sbSample.ToString(); |
實用方法整理
以上做了 2 個範例,可以了解 Base64 轉換的方式,但這種常用的方法就是要獨立出來方便呼叫,那我就提供我自己整理好的獨立方法給各位參考。
Base 64 轉碼/解碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/// <summary> /// Base 64 轉碼 /// </summary> /// <param name="plainText"></param> /// <returns></returns> public static string EncodeBase64(string plainText) { var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); return System.Convert.ToBase64String(plainTextBytes); } /// <summary> /// Base 64 解碼 /// </summary> /// <param name="base64EncodedData"></param> /// <returns></returns> public static string DecodeBase64(string base64EncodedData) { var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); } |
Base64 Url 轉碼/解碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
/// <summary> /// Base 64 Url 轉碼 /// </summary> /// <param name="input"></param> /// <returns></returns> public static string EncodeBase64Url(string input) { byte[] b = Encoding.UTF8.GetBytes(input); var output = Convert.ToBase64String(b); output = output.Split('=')[0]; // Remove any trailing '='s output = output.Replace('+', '-'); // 62nd char of encoding output = output.Replace('/', '_'); // 63rd char of encoding return output; } /// <summary> /// Base 64 Url 解碼 /// </summary> /// <param name="input"></param> /// <returns></returns> public static string DecodeBase64Url(string input) { var output = input; output = output.Replace('-', '+'); // 62nd char of encoding output = output.Replace('_', '/'); // 63rd char of encoding switch (output.Length % 4) // Pad with trailing '='s { case 0: break; // No pad chars in this case case 2: output += "=="; break; // Two pad chars case 3: output += "="; break; // One pad char default: throw new ArgumentOutOfRangeException( nameof(input), "Illegal base64url string!"); } byte[] converted = Convert.FromBase64String(output); // Standard base64 decoder string str = Encoding.UTF8.GetString(converted); return str; } |
重點整理
- Base64 是一組基於 64 個可列印字元的索引轉換表
- 使用 ToBase64String() 可轉碼為 Base64
- 避開網址關鍵字 = + / 就可適用在網址上
相關學習文章
- [ASP.NET MVC] QR Code 製作與 Base32 編碼應用 (附範例下載)
- [C#] Base32 編碼/解碼方法 不分大小寫的編碼方式
- ASP.NET MVC 的 Razor 語法如何顯示關鍵字符號 @
如果你在學習上有不懂的地方,需要諮詢服務,可以參考站長服務,我想辨法解決你的問題
如果文章內容有過時、不適用或錯誤的地方,幫我在下方留言通知我一下,謝謝