这次示范一个 C# 内将字串转为 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 编码,这样可支援的文字更多。
先看一下此范例输出的结果
来看看程序码
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();
这个范例是第 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进位 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 转码/解码
/// <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 '='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
避开网址关键字 = + / 就可适用在网址上
[C#]QR Code 网址产生与解析 (附范例)
[C#] Base32 编码/解码方法 不分大小写的编码方式
bubble sort的概念就是像泡泡一样 ,越大的数字会渐渐的往右边浮 比较相邻的元素 ,两两比...
每一个动作都是函数 语法 A::install.packages("aa") ...
今天的实作内容主要根据教学网站进行。 将应用程序安装到Heroku (接续Day27) 使用GIT将...
LinearLayout是透过android:orientation来设定布局方向 分为 andro...
续上一篇文章,写到後面还有一些观念没有讲得很清楚,像是var有Hoisting的特性,coding的...