这次示範一个 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 基本转码
先看一下此範例输出的结果
来看看程式码
StringBuilder sbSample = new StringBuilder();string inputText = "Test中文"; // 来源文字sbSample.Append("原始文字: " + inputText + "<br>");// 转换Byte[] bytesEncode = System.Text.Encoding.UTF8.GetBytes(inputText); //取得 UTF8 2进位 Bytestring resultEncode = Convert.ToBase64String(bytesEncode); // 转换 Base64 索引表sbSample.Append("Base 64 转换结果: " + resultEncode + "<br>");// 还原Byte[] bytesDecode = Convert.FromBase64String(resultEncode); // 还原 Bytestring resultText = System.Text.Encoding.UTF8.GetString(bytesDecode); // 还原 UTF8 字元sbSample.Append("还原结果: " + resultText);// 输出网页ViewBag.resultText = sbSample.ToString();
範例 2: ToBase64String 适用网址参数转码
这个範例是第 1 个範例的延伸应用,因为在 Base64 转换后的字元中有 = + / 等字元,= + / 这些字元不适合直接放在网址中当参数传递,会与网址的关键字重複导致判断错误,如果要将转换结果放至网址中当参数使用,需要做一些修改。
先看一下这次修改的範例画面
这次範例中转换后的 Base64 少了后面两个 ==
可是当转换回原本字元时并不影响结果,那是因为 == 是为了满足 Base64 足够位元数计算而加上去的,只要了解原理就可以在转码网址参数上先隐藏,待解码时再加回来。
在网址中还有 + / 都会影响判断,只要在编码时取代掉,待解码时转换回来即可。
来看看这次修改的程式码
StringBuilder sbSample = new StringBuilder();string inputText = "Test中文"; // 来源文字sbSample.Append("原始文字: " + inputText + "<br>");// 网址参数转换Byte[] bytesEncode = System.Text.Encoding.UTF8.GetBytes(inputText); //取得 UTF8 2进位 Bytestring resultEncode = Convert.ToBase64String(bytesEncode); // 转换 Base64 索引表resultEncode = resultEncode.Split('=')[0]; // Remove any trailing '='sresultEncode = resultEncode.Replace('+', '-'); // 62nd char of encodingresultEncode = resultEncode.Replace('/', '_'); // 63rd char of encodingsbSample.Append("Base 64 转换结果: " + resultEncode + "<br>");// 还原resultEncode = resultEncode.Replace('-', '+'); // 62nd char of encodingresultEncode = resultEncode.Replace('_', '/'); // 63rd char of encodingswitch (resultEncode.Length % 4) // Pad with trailing '='s{case 0:break; // No pad chars in this casecase 2:resultEncode += "==";break; // Two pad charscase 3:resultEncode += "=";break; // One pad chardefault:throw new ArgumentOutOfRangeException(nameof(resultEncode), "Illegal base64url string!");}Byte[] bytesDecode = Convert.FromBase64String(resultEncode); // 还原 Bytestring resultText = System.Text.Encoding.UTF8.GetString(bytesDecode); // 还原 UTF8 字元sbSample.Append("还原结果: " + resultText);ViewBag.resultText = sbSample.ToString();// 输出网页ViewBag.resultText = sbSample.ToString();
实用方法整理
以上做了 2 个範例,可以了解 Base64 转换的方式,但这种常用的方法就是要独立出来方便呼叫,那我就提供我自己整理好的独立方法给各位参考。
Base 64 转码/解码
/// <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 转码/解码
/// <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 '='soutput = output.Replace('+', '-'); // 62nd char of encodingoutput = output.Replace('/', '_'); // 63rd char of encodingreturn 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 encodingoutput = output.Replace('_', '/'); // 63rd char of encodingswitch (output.Length % 4) // Pad with trailing '='s{case 0:break; // No pad chars in this casecase 2:output += "==";break; // Two pad charscase 3:output += "=";break; // One pad chardefault:throw new ArgumentOutOfRangeException(nameof(input), "Illegal base64url string!");}byte[] converted = Convert.FromBase64String(output); // Standard base64 decoderstring str = Encoding.UTF8.GetString(converted);return str;}
重点整理
Base64 是一组基于 64 个可列印字元的索引转换表
使用 ToBase64String() 可转码为 Base64
避开网址关键字 = + / 就可适用在网址上
相关学习文章
[C#]QR Code 网址产生与解析 (附範例)
[C#] Base32 编码/解码方法 不分大小写的编码方式